假如你有一間 pizza 店,要點餐時,你可能會這樣寫程式:
這樣就無法讓 orderPizza 對修改關閉。
即然我們知道 if 判斷式那邊可能會一直修改,那就把他獨立出來吧:
而原本的 pizza 程式碼就可以改寫成以下這樣:
畫成類別圖的話如以下:
由上圖可知,PizzaStore 是工廠的客戶,工廠應該是此系統中唯一用具象 pizza 類別的地方,而多個 pizza 就是 工廠會生產出的產品。
簡單工廠其實不算是設計模式,但因為很常被使用,倒不如說它是一種寫程式的習慣。
參考資料:
深入淺出設計模式(Head First Design Patterns)
Pizza orderPizza(String type)
{
Pizza pizza;
if(type.equals("cheese"))
{
pizza = new CheesePizza();
}
else if(type.equals("beef"))
{
pizza = new BeefPizza();
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
這很明顯可以看出有問題: 當想要更改菜單時會一直修改到 if 判斷式的程式碼,這樣就無法讓 orderPizza 對修改關閉。
即然我們知道 if 判斷式那邊可能會一直修改,那就把他獨立出來吧:
public class SimplePizzaFactory {
public Pizza createPizza(String type)
{
Pizza pizza;
if(type.equals("cheese"))
{
pizza = new CheesePizza();
}
else if(type.equals("beef"))
{
pizza = new BeefPizza();
}
return pizza;
}
}
而原本的 pizza 程式碼就可以改寫成以下這樣:
public class PizzaStore {
SimplePizzaFactory mFactory; // 加入工廠
public PizzaStore(SimplePizzaFactory factory)
{
mFactory = factory;
}
public Pizza orderPizza(String type)
{
Pizza pizza;
// 由工廠負責生產 pizza
pizza = mFactory.createPizza(type);
// 其餘的事情不管哪種 pizza 作法都一樣,
// 因此不用獨立出去
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
畫成類別圖的話如以下:
簡單工廠其實不算是設計模式,但因為很常被使用,倒不如說它是一種寫程式的習慣。
參考資料:
深入淺出設計模式(Head First Design Patterns)

文章寫得很好 感謝分享
回覆刪除