工廠模式之簡單工廠
概念
簡單工廠可以理解為,定義一個工廠類,根據傳入的引數不同而返回不同的例項,這些例項通常有共同的父類。
雖然簡單工廠經常會被使用,但是並不能算作是一種設計模式,反而更像是一種程式設計習慣。
提出問題
當我們建立產品類物件時,會使用到 new
操作符,但是程式碼綁著具體類的例項會導致程式碼更脆弱,更缺乏彈性。
例項化這個活動不應該總是公開的進行。
否則一旦有變化或擴充套件,就必須重新開啟這段程式碼進行檢查和修改。
我們的原則是:“找出會變化的方面,把他們從不變的部分分離出來”。
即讓我們編寫的程式碼符合 開放-關閉原則 。
思路
建立一個 factory
類,將建立產品類物件的程式碼放在 factory
類中,由 factory
類的物件專職建立產品類的物件。
UML圖

- 工廠類 : Factory
- 抽象產品類 : Product
- 具體產品類 : ConcreteProductA 和 ConcreteProductB
例項
假設有一個披薩店,如果有了披薩訂單,運用簡單工廠處理披薩訂單。
類圖

程式碼:
- 抽象類
Pizza
package cn.edu.nwpu.simpleFactory; /** * * @author yylin * */ public abstract class Pizza { public void prepare() { System.out.println("prepare..."); } public void bake() { System.out.println("bake..."); } public void cut() { System.out.println("cut..."); } public void box() { System.out.println("box..."); } }
-
Pizza
類的實現類CheesePizza
package cn.edu.nwpu.simpleFactory; /** * * @author yylin * */ public class CheesePizza extends Pizza { }
-
Pizza
類的實現類VeggiePizza
package cn.edu.nwpu.simpleFactory; /** * * @author yylin * */ public class VeggiePizza extends Pizza { }
-
Pizza
類的實現類ClamPizza
package cn.edu.nwpu.simpleFactory; /** * * @author yylin * */ public class ClamPizza extends Pizza { }
-
Pizza
類的實現類PepperoniPizza
package cn.edu.nwpu.simpleFactory; /** * * @author yylin * */ public class PepperoniPizza extends Pizza { }
- 簡單工廠類
SimplePizzaFactory
package cn.edu.nwpu.simpleFactory; /** * * @author yylin * */ public class SimplePizzaFactory { public static Pizza creatPizza(String type) { // TODO 所有客戶用這個方法來例項化新物件 Pizza pizza = null; if (type.equals("Cheese")) { pizza = new CheesePizza(); } else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); } else if (type.equals("clam")) { pizza = new ClamPizza(); } else if (type.equals("veggie")) { pizza = new VeggiePizza(); } return pizza; } }
- 客戶類
PizzaStore
package cn.edu.nwpu.simpleFactory; /** * * @author yylin * */ public class PizzaStore { private SimplePizzaFactory factory = null; PizzaStore(SimplePizzaFactory factory) { this.factory = factory; } // 處理披薩訂單的方法 public Pizza orderPizza(String type) { Pizza pizza = null; pizza = factory.creatPizza(type); pizza.prepare(); // 準備 pizza.bake(); // 烘烤 pizza.cut(); // 切片 pizza.box(); //裝盒 return pizza; } }
總結
-
利用靜態方法定義一個簡單工廠,稱為 靜態工廠 , 靜態工廠 不需要使用建立物件的方法來例項化物件,但是不能通過繼承來改變建立物件的區別。
-
簡單工廠的優點:實現物件的建立和物件的使用分離,將物件的建立交給專門的工廠類負責。
-
簡單工廠的缺點:工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯程式碼,而且產品較多時,工廠方法程式碼將會非常複雜。
-
在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。
-
簡單工廠模式包含三個角色:
(1)工廠角色:負責實現建立所有例項的內部邏輯;
(2)抽象產品角色:是所建立的所有物件的父類,負責描述所有例項所共有的公共介面;
(3)具體產品角色:是建立目標,所有建立的物件都充當這個角色的某個具體類的例項。
-
簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的引數,就可以獲取你所需要的物件,而無須知道其建立細節。
-
簡單工廠模式適用情況包括:
(1)工廠類負責建立的物件比較少;
(2)客戶端只知道傳入工廠類的引數,對於如何建立物件不關心。
參考:Head First設計模式