一、工廠模式分爲三類:
(1)簡單工廠模式:一個工廠建立全部產品
(2)工廠方法模式:一個工廠方法建立一個產品
(3)抽象工廠模式:一個工廠方法建立一類產品ide
二、建立型模式
這種模式是指將實例的建立和使用分離開來,隱藏類實例的建立細節,外界對於對象只須要知道它們共同的接口便可。函數
一、組成
(1)工廠類:工廠模式的核心,經過調用它來實現其餘類的功能。
(2)抽象產品角色
(3)具體產品角色:繼承抽象工廠角色,工廠類就是建立此角色的實例。this
二、舉例
想要說明這個模式,咱們能夠看一個簡單的例子
(1)首先建立一個Operation抽象類,做爲抽象產品角色code
public abstract class Operation { private int operator1; private int operator2; public int getOperator1() { return operator1; } public int getOperator2() { return operator2; } public void setOperator1(int operator1) { this.operator1 = operator1; } public void setOperator2(int operator2) { this.operator2 = operator2; } protected abstract int getResult(); }
(2)若是咱們想要實現加減法運算,能夠寫一個類繼承Operation類,而且重寫getResult方法。對象
public class OperationAdd extends Operation { @Override public int getResult(){ return getOperator1() + getOperator2(); } } public class OperationMinus extends Operation { @Override public int getResult(){ return getOperator1() - getOperator2(); } }
(3)若是咱們要進行加減法運算,能夠直接調用這兩個類建立出的實例的方法,可是簡單工廠模式但願咱們可以另外創建一個工廠,而且用這個工廠來建立加減法類的實例。由於這樣咱們就不須要知道具體類的名字,只須要傳入加減法的符號便可。繼承
public class Factory { public static Operation createOperation(String operator){ Operation op = null; switch (operator){ case "+": op = new OperationAdd(); break; case "-": op = new OperationMinus(); break; } return op; } }
(4)這樣咱們的main函數就能夠寫成這樣子。接口
public static void main(String []args){ Operation add = Factory.createOperation("+"); add.setOperator1(100); add.setOperator2(60); System.out.println(add.getResult()); }
三、存在的問題
咱們能夠考慮一下這種方式存在的問題,使用簡單工廠模式,能夠不用知道具體類的名字,直接交給工廠來建立。get
可是這樣一來,若是咱們想要增長新的運算,即給工廠增長新的產品,首先寫新類,還要更改工廠類,增長新的switch判斷邏輯,也就不符合開閉原則(對修改關閉,對擴展開放)。產品
3、工廠方法模式
利用工廠方法模式能夠有效解決簡單工廠模式破壞開閉原則的問題。
工廠方法模式在簡單工廠模式基礎上的主要變化在於,增長了一個抽象工廠接口,讓每一個具體工廠類去實現抽象工廠接口,這樣用戶就不用關心具體工廠類建立的細節。it
一、舉例
仍是對於運算器這個例子,咱們根據工廠模式進行修改。
(1)建立抽象工廠接口
public interface TemplateFactory { Operation CreateOperation(); }
(2)建立加法工廠,實現抽象工廠接口
public class AddFactory implements TemplateFactory{ public Operation CreateOperation(){ return new OperationAdd(); } } public class MinusFactory implements TemplateFactory{ public Operation CreateOperation(){ return new OperationMinus(); } }
(3)main函數
public static void main(String []args){ TemplateFactory factory = new AddFactory(); Operation add = factory.CreateOperation(); add.setOperator1(100); add.setOperator2(60); System.out.println(add.getResult()); }
使用工廠方法模式,可以實現高度解耦,須要增長新的產品時,只須要增長相關的類和工廠便可,不須要改動已有的產品和工廠。
二、存在的問題
使用工廠方法模式的主要問題在於,每次增長一個產品,都須要新增至少兩個類,這會增長系統的複雜性。
抽象工廠模式中提到一個產品族的概念,根據前面兩個工廠模式,簡單工廠是一個工廠「生產」全部產品,工廠方法是一個工廠生產一個產品。
而抽象工廠就是一個工廠生產一個產品族,產品族這個概念,是指位於不一樣產品等級結構中,功能相關的產品組成的家族。
一、舉例
好比咱們如今兩個產品族,HUAWEI手機族和XIAOMI手機族,兩個族中又分別包含商務機和時尚機這兩種不一樣產品等級的手機類型,那麼咱們須要創建兩個工廠:HUAWEI工廠和XIAOMI工廠,每一個工廠裏又分別提供生產商務機和時尚機。這裏就不經過代碼來講明瞭。
工廠模式的主要目的,就是爲了將實例對象的建立和使用分開,因此工廠乾的事情,就是實例化對象。
而三種方式的聯繫能夠經過這張圖來幫助理解。
http://www.hollischuang.com/w...
參考:
http://www.hollischuang.com/w...你覺得工廠模式很簡單,多是由於你懂的只是冰山的一角