簡單工廠、工廠方法、抽象工廠之小結、區別

本文有更新,請移步個人我的博客:https://blog.andyqiao.top/article/12/設計模式

 

不少時候,我發現這三種設計模式難以區分,經常會張冠李戴鬧了笑話。頗有必要深刻總結一下三種設計模式的特色、相同之處和不一樣之處。函數

1 本質

  三個設計模式名字中都含有「工廠」二字,其含義是使用工廠(一個或一系列方法)去生產產品(一個或一系列類的實例)設計

  另外,有時候,咱們經常會將生產產品的一個或一系列方法封裝到一個類中,我習慣把這個類叫作「工廠類」;而被實例化的類稱做「產品類」。指針

2 簡單工廠

  工廠類(SimpleFactory)擁有一個工廠方法(create),接受了一個參數,經過不一樣的參數實例化不一樣的產品類。blog

  以下邊UML類圖所示爲簡單工廠。  接口

  

  優勢:get

    (1)很明顯,簡單工廠的特色就是「簡單粗暴」,經過一個含參的工廠方法,咱們能夠實例化任何產品類,上至飛機火箭,下至土豆麪條,無所不能。因此簡單工廠有一個別名:上帝類。博客

  缺點:產品

    (1)任何」東西「的子類均可以被生產,負擔過重。當所要生產產品種類很是多時,工廠方法的代碼量可能會很龐大。引用

    (2)在遵循開閉原則(對拓展開放,對修改關閉)的條件下,簡單工廠對於增長新的產品,無能爲力。由於增長新產品只能經過修改工廠方法來實現。

  工廠方法正好能夠解決簡單工廠的這兩個缺點。

3 工廠方法

  工廠方法是針對每一種產品提供一個工廠類。經過不一樣的工廠實例來建立不一樣的產品實例。

  以下邊UML類圖所示爲工廠方法。

  

  優勢:

    (1)工廠方法模式就很好的減輕了工廠類的負擔,把某一類/某一種東西交由一個工廠生產;(對應簡單工廠的缺點1)

    (2)同時增長某一類」東西「並不須要修改工廠類,只須要添加生產這類」東西「的工廠便可,使得工廠類符合開放-封閉原則。

  缺點:

    (1)相比簡單工廠,實現略複雜。

    (2)對於某些能夠造成產品族的狀況處理比較複雜。

  對於缺點(2),咱們能夠借用抽象工廠來實現。

4 抽象工廠

  抽象工廠是應對產品族概念的。

  例如,汽車能夠分爲轎車、SUV、MPV等,也分爲奔馳、寶馬等。咱們能夠將奔馳的全部車看做是一個產品族,而將寶馬的全部車看做是另外一個產品族。分別對應兩個工廠,一個是奔馳的工廠,另外一個是寶馬的工廠。與工廠方法不一樣,奔馳的工廠不僅是生產具體的某一個產品,而是一族產品(奔馳轎車、奔馳SUV、奔馳MPV)。「抽象工廠」的「抽象」指的是就是這個意思。

  上邊的工廠方法模式是一種極端狀況的抽象工廠模式(即只生產一種產品的抽象工廠模式),而抽象工廠模式能夠當作是工廠方法模式的一種推廣。

  以下邊UML類圖所示爲抽象工廠。

  

  優勢:針對產品族;

  缺點:針對產品族。

  因此,只有對應產品族的狀況下,才須要使用抽象工廠模式。

5 區別

  簡單工廠 : 用來生產同一等級結構中的任意產品。(不支持拓展增長產品)

  工廠方法 :用來生產同一等級結構中的固定產品。(支持拓展增長產品)   

  抽象工廠 :用來生產不一樣產品族的所有產品。(不支持拓展增長產品;支持增長產品族)  

6 注意事項

  (1)工廠類經常採用單例模式(Singleton)。

  (2)工廠類擁有基類(定義共同接口),基類能夠爲純虛類,也能夠定義缺省方法。

  (3)對於工廠方法和抽象工廠,基類中的生產產品的函數經常爲虛函數,以實現動態綁定。

  (4)調用工廠方法的函數一般採用工廠實現的指針和引用做爲形參,以便根據不一樣的工廠實參調用不一樣的工廠方法。

相關文章
相關標籤/搜索