工廠模式01之簡單工廠
參考:Head First設計模式
概念
簡單工廠(Simple Factory)模式,又稱靜態工廠方法模式(Static Factory Method Pattern)。
簡單工廠可以理解為,定義一個工廠類,根據傳入的引數不同而返回不同的例項,這些例項通常有共同的父類。
雖然簡單工廠經常會被使用,但是並不能算作是一種設計模式,反而更像是一種程式設計習慣。
提出問題
當我們建立產品類物件時,會使用到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)客戶端只知道傳入工廠類的引數,對於如何建立物件不關心。