簡單工廠,其實不是一個設計模式,反而更像一個種編程習慣。但是它的卻別程序員頻繁使用。
當看到“new”,就會想到“具體”。是的,使用new時,你的確實是在實例化一個具體類,所以用的確實是實現,而不是接口。如:
Duck duck = new MallardDuck();
當一羣相關的具體類時,通常會寫出這樣的代碼:
public Pizza orderPizza(String type) {
Pizza pizza = null ;
if ("cheese".equals(type)) {
pizza = new CheesePizza();
} else if ("pepperoni".equals(type)) {
pizza = new PepperoniPizza();
} else if ("clam".equals(type)) {
pizza= new ClamPizza();
}
}
爲了讓系統更有彈性,我們希望修改的地方更少一點,因此遵循對擴展開放,對修改關閉的原則,讓我們建立簡單工程吧。
首先把創建對象的代碼從orderPizza()方法中抽離。
然後將創建對象的部分代碼搬到另一個對象中,這個對象只管如何創建比薩。
public class SimplePizzaFactory {
/*
* 這樣做的好處,就在於SimplePizzaFactory可以有許多客戶。
* 例如:披薩店菜單PizzaShopMenu會利用這個工程來取得比薩的價錢和描述
* 可能有會一個宅急送HomeDeliver與Pizzashop類不同的方式來處理披薩。
* 把創建比薩的代碼包裝進一個類,當以後實現改變時,只需修改這個類即可
* 作用或目的:把實例化的代碼從客戶代碼中刪除.
* 另:利用靜態方法定義個簡單的工廠也是常見做法。
*/
public Pizza createPize(String type){
Pizza pizza = null;
if ("cheese".equals(type)) {
pizza = new CheesePizza();
} else if ("pepperoni".equals(type)) {
pizza = new PepperoniPizza();
} else if ("clam".equals(type)) {
pizza= new ClamPizza();
}//這裏將會有更多不同類型的披薩出現
return pizza;
}
}
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory){
this.factory = factory;
}
public Pizza orderPizza(String type) {
Pizza pizza = null ;
/*把創建對象的代碼從這裏抽離出來,放到一個新的類中
* if ("cheese".equals(type)) {
pizza = new CheesePizza();
} else if ("pepperoni".equals(type)) {
pizza = new PepperoniPizza();
} else if ("clam".equals(type)) {
pizza= new ClamPizza();
}*/
factory.createPize(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
說明:Pizza爲一個抽象類,它有相關的方法,以及它的相關子類,這裏就不一一貼上來了。
提醒:在設計模式中,所謂的“實現一個接口”,並不一定,表示“寫一個類,並利用implement關鍵詞來實現某個Java接口”。“實現一個接口”泛指“實現某個超類型(可以是類或接口的某個方法)”