簡單工廠、工廠方法、抽象工廠

轉載并補充自:https://www.cnblogs.com/qiaoconglovelife/p/5750290.html

簡單工廠

image

工廠類(SimpleFactory)擁有一個工廠方法(create),接受了一個參數,通過不同的參數實例化不同的產品類。
 
優(yōu)點:

  • 很明顯,簡單工廠的特點就是“簡單粗暴”,通過一個含參的工廠方法,我們可以實例化任何產品類,上至飛機火箭,下至土豆面條,無所不能。所以簡單工廠有一個別名:上帝類。

缺點:

  • 任何”東西“的子類都可以被生產,負擔太重。當所要生產產品種類非常多時,工廠方法的代碼量可能會很龐大。
  • 在遵循開閉原則(對拓展開放,對修改關閉)的條件下,簡單工廠對于增加新的產品,無能為力。因為增加新產品只能通過修改工廠方法來實現。

適用場景:單個產品且種類較少且固定

抽象類別比較少的時候,比如http傳輸方式只有GET和POST

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

工廠方法模式

image

工廠方法是針對每一種產品提供一個工廠類。通過不同的工廠實例來創(chuàng)建不同的產品實例。

優(yōu)點:

  • 工廠方法模式就很好的減輕了工廠類的負擔,把某一類/某一種東西交由一個工廠生產;(對應簡單工廠的缺點1)
  • 同時增加某一類”東西“并不需要修改工廠類,只需要添加生產這類”東西“的工廠即可,使得工廠類符合開放-封閉原則。

缺點:

  • 相比簡單工廠,實現略復雜。
  • 對于某些可以形成產品族的情況處理比較復雜。

適用場景:單個產品且種類不確定容易變化

比如數據庫訪問類,不同數據庫使用模式可能不一致,但是基礎操作都是增刪改查,產品很多:MySQL、Oracle、SQLite等等并且隨時可能添加一個新的數據庫,這個時候

抽象工廠

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

例如,汽車可以分為轎車、SUV、MPV等,也分為奔馳、寶馬等。我們可以將奔馳的所有車看作是一個產品族,而將寶馬的所有車看作是另一個產品族。分別對應兩個工廠,一個是奔馳的工廠,另一個是寶馬的工廠。與工廠方法不同,奔馳的工廠不只是生產具體的某一個產品,而是一族產品(奔馳轎車、奔馳SUV、奔馳MPV)?!俺橄蠊S”的“抽象”指的是就是這個意思。

上邊的工廠方法模式是一種極端情況的抽象工廠模式(即只生產一種產品的抽象工廠模式),而抽象工廠模式可以看成是工廠方法模式的一種推廣。

如下邊UML類圖所示為抽象工廠。
  


image

只有對應產品族的情況下,才需要使用抽象工廠模式。

適用場景:具有產品族抽象規(guī)范(每個工廠都具有同樣類型的產品)且有多個類別的時候。

硬件設備的連接:dell家的鼠標、鍵盤、顯示器;Lenovo家的相同產品等等

區(qū)別

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

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

抽象工廠 :用來生產不同產品族的全部產品。(不支持拓展增加產品;支持增加產品族)

注意事項

  • 工廠類常常采用單例模式(Singleton)。
  • 工廠類擁有基類(定義共同接口),基類可以為純虛類,也可以定義缺省方法。
  • 對于工廠方法和抽象工廠,基類中的生產產品的函數常常為虛函數,以實現動態(tài)綁定。
  • 調用工廠方法的函數通常采用工廠實現的指針和引用作為形參,以便根據不同的工廠實參調用不同的工廠方法。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容