跟工廠方法模式一樣,都會把製造方法放在工廠中,跟客戶端分離。
每個工廠會對同一個食材介面生產出不同類別
e.g. 在上篇範例中,ChicagoPizzaFactory()
用 Ketchup()
實作介面Sauce()
;NYPizzaFactory()
用 WhiteSauce()
來實作。
public class ChicagoPizzaFactory implements IngredientFactory{
public Sauce createSauce(){
//醬汁的子類別是茄汁
Sauce sauce = new Ketchup();
return sauce;
}
}
public class NYPizzaFactory implements IngredientFactory{
public Sauce createSauce(){
//醬汁的子類別是白醬
Sauce sauce = new WhiteSauce();
return sauce;
}
}
在抽象工廠的介面中,每個方法都是用來定義不同產品的製造方法。
e.g.
在Pizza Store範例中, IngredientFactory()
裡面的方法都是用來製造食材
public interface IngredientFactory {
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
public Seafood createSeafood();
public Veggies createVeggies();
}
用UML圖來看是最直觀的:
抽象工廠模式
工廠方法模式
同樣都是將製造產品的方法獨立到工廠中,最大的差異就是,抽象工廠模式是利用抽象類別(或介面)去定義要生產的產品,所以底下會有子類別實作,像上圖Cheese()
Sauce()
會有不同工廠生產不同子類別。
工廠方法模式則是單純把產品定義為類別去生產,所以沒有優劣之分。單純是根據對於要生產的產品特性去決定,如果今天你的產品之間沒有什麼關聯性或是需要分類,那可以直接用工廠方法模式去做。相反的,若是你的產品有某些大分類或是系列,用抽象工廠模式會讓整體彈性更大,後續維護更方便。
Disclaimer
因為讀的是原文版,所以難免會有翻譯詞不達意或是專有名詞上的差異,有錯誤的話歡迎在留言區一起交流!