iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
自我挑戰組

深入淺出設計模式 (Head First Design Pattern) - 重點整理及範例分享系列 第 15

[深入淺出設計模式] Ch4 The Factory Pattern (5) - 【抽象工廠模式】Abstract Factory Pattern 與工廠方法模式差在哪裡?

  • 分享至 

  • xImage
  •  

抽象工廠模式 Abstract Factory Pattern

  1. 跟工廠方法模式一樣,都會把製造方法放在工廠中,跟客戶端分離。

  2. 每個工廠會對同一個食材介面生產出不同類別
    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;
         }
     }
    
  3. 在抽象工廠的介面中,每個方法都是用來定義不同產品的製造方法。
    e.g.
    在Pizza Store範例中, IngredientFactory()裡面的方法都是用來製造食材

    public interface IngredientFactory {
         public Dough createDough();
         public Sauce createSauce();
         public Cheese createCheese();
         public Seafood createSeafood();
         public Veggies createVeggies();
     }
    

抽象工廠模式 vs 工廠方法模式

用UML圖來看是最直觀的:

抽象工廠模式
https://ithelp.ithome.com.tw/upload/images/20230930/20163178f1GHaGzihX.png

工廠方法模式
https://ithelp.ithome.com.tw/upload/images/20230930/20163178w6uToILDtG.png

同樣都是將製造產品的方法獨立到工廠中,最大的差異就是,抽象工廠模式是利用抽象類別(或介面)去定義要生產的產品,所以底下會有子類別實作,像上圖Cheese() Sauce()會有不同工廠生產不同子類別。

工廠方法模式則是單純把產品定義為類別去生產,所以沒有優劣之分。單純是根據對於要生產的產品特性去決定,如果今天你的產品之間沒有什麼關聯性或是需要分類,那可以直接用工廠方法模式去做。相反的,若是你的產品有某些大分類或是系列,用抽象工廠模式會讓整體彈性更大,後續維護更方便。


參考資料:

  1. 《深入淺出設計模式 (Head First Design Patterns) 》
  2. 書中官方程式碼傳送門

Disclaimer
因為讀的是原文版,所以難免會有翻譯詞不達意或是專有名詞上的差異,有錯誤的話歡迎在留言區一起交流!


上一篇
[深入淺出設計模式] Ch4 The Factory Pattern (4) - 【工廠模式】範例: Pizza Store
下一篇
[深入淺出設計模式] Ch4 The Factory Pattern (6) - 【設計原則複習】
系列文
深入淺出設計模式 (Head First Design Pattern) - 重點整理及範例分享35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言