假如你有一間 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)
文章寫得很好 感謝分享
回覆刪除