如何讓孩子愛上設計模式 —— 5.工廠方法模式(Factory Method Pattern)

標簽: 設計模式初涉


描述性文字

舉個小豬賣奶茶的簡單例子,引入簡單工廠模式,再引入工廠方法模式。


1.新店開張,親力親為

賣奶茶,品種有很多,什么珍珠奶茶,椰果奶茶,黑冰鉆奶茶等,
制作方法差不多,我們簡化下流程咯:加奶,加茶,加料,打包,
假定是這四步,就加料的環節不一樣,然后抽象出一個奶茶父類:

接著繼承奶茶父類,實現兩個子類,珍珠奶茶類與椰果奶茶類:

因為剛開店,只有你一個人,小豬需要自己做奶茶:

接著有三個客人要點奶茶,然后小豬按需制作:

然后三杯奶茶制作完畢,遞給用戶:

這個簡單的例子就是 簡單工廠模式 ,三個角色:

  • Product(抽象產品):封裝了各種產品對象的公有方法,比如這里的Tea;
  • ConcreteProduct(具體產品):抽象產品的具體化,比如這里的珍珠和椰果Tea;
  • Factory(工廠):實現創建所有產品實例的內部邏輯,比如這里的Me;

2.店鋪擴展,請幾個小弟

因為小豬獨特的奶茶制作工藝,吸引了慕名而來的吃貨,也越顯得店小,
小豬把心一橫,決定把店鋪擴大,然后也招了兩個小弟,小豬把自己做
奶茶的套路總結出來,然后讓兩個小弟自由發揮,一個做珍珠,一個做
椰果!

做奶茶的套路抽取:

珍珠小弟繼承這個套路上加入了港式風格:

椰果小弟也不服輸,加入了日式風格:

做奶茶的工作都交給小弟了,小豬就沒事做等收錢了,店里現在變成這樣:

一樣的套路,兩小弟卻玩出了不同的花樣:

然后這個例子就是 工廠方法模式,在簡單工廠基礎上,
工廠創建不同產品的內部邏輯抽取出來,生成一個
抽象工廠,然后創建具體的工廠類,來產生不同的產品!

UML類圖如下


總結時間

上面通過兩個例子來學習了:簡單工廠模式工廠方法模式

簡單工廠模式由三部分組成,而工廠方法模式則是將工廠的生產產品
的邏輯給抽取出來,然后使用不同的具體工廠實現類來生產不同的
產品。套上例子就是:

奶茶 -> 珍珠奶茶,椰果奶茶 , 我(生產不同奶茶)

奶茶 -> 珍珠奶茶,椰果奶茶 , 奶茶生產套路 -> 奶茶小弟,椰果小弟

都說得那么明白了,我也不逼逼了,接著說下適用場景與優缺點:


適用場景

簡單工廠模式

  • 工廠類負責創建的對象比較少;
  • 客戶只知道傳入工廠類的參數,對于如何創建對象(邏輯)不關心;

工廠方法模式

  • 復雜對象生成;
  • 當需要系統有比較好的擴展性時,可以考慮工廠模式,不同的產品用不同的實現工廠來組裝;

優缺點

簡單工廠模式

  • 工廠類負責所有對象的創建邏輯,該類出問題整個系統掛掉;
  • 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯;
  • 簡單工廠模式由于使用了靜態工廠方法,所以工廠角色無法形成基于繼承的等級結構;

工廠方法模式

  • 在添加新產品時,需要編寫新的具體產品類,而且還要提供與之對應的
    具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的復雜度,
    有更多的類需要編譯和運行,會給系統帶來一些額外的開銷。
  • 由于考慮到系統的可擴展性,需要引入抽象層,在客戶端代碼中均使
    用抽象層進行定義,增加了系統的抽象性和理解難度。

附:通過反射簡潔生產過程

上面通過一個type來區分要生產的是珍珠還是椰果奶茶,顯得有些繁瑣,
其實可以通過反射,直接傳入產品的類類型,即可生成對應產品,實現
示例代碼如下:

本節代碼

https://github.com/coder-pig/DesignPatternsExample/tree/master/4.Factory%20Method%20Pattern


附:簡單工廠模式又叫靜態工廠模式!
另外,本系列只是快速過一過設計模式,主要的念想是先掌握怎么用,會寫,
對于具體何時用,還需通過項目積累相關經驗!優缺點摘自網絡,不用過于
糾結這個!!!


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容