轉載并補充自:https://www.cnblogs.com/qiaoconglovelife/p/5750290.html
簡單工廠
工廠類(SimpleFactory)擁有一個工廠方法(create),接受了一個參數(shù),通過不同的參數(shù)實例化不同的產(chǎn)品類。
優(yōu)點:
- 很明顯,簡單工廠的特點就是“簡單粗暴”,通過一個含參的工廠方法,我們可以實例化任何產(chǎn)品類,上至飛機火箭,下至土豆面條,無所不能。所以簡單工廠有一個別名:上帝類。
缺點:
- 任何”東西“的子類都可以被生產(chǎn),負擔太重。當所要生產(chǎn)產(chǎn)品種類非常多時,工廠方法的代碼量可能會很龐大。
- 在遵循開閉原則(對拓展開放,對修改關閉)的條件下,簡單工廠對于增加新的產(chǎn)品,無能為力。因為增加新產(chǎn)品只能通過修改工廠方法來實現(xiàn)。
適用場景:單個產(chǎn)品且種類較少且固定
抽象類別比較少的時候,比如http傳輸方式只有GET和POST
工廠方法正好可以解決簡單工廠的這兩個缺點。
工廠方法模式
工廠方法是針對每一種產(chǎn)品提供一個工廠類。通過不同的工廠實例來創(chuàng)建不同的產(chǎn)品實例。
優(yōu)點:
- 工廠方法模式就很好的減輕了工廠類的負擔,把某一類/某一種東西交由一個工廠生產(chǎn);(對應簡單工廠的缺點1)
- 同時增加某一類”東西“并不需要修改工廠類,只需要添加生產(chǎn)這類”東西“的工廠即可,使得工廠類符合開放-封閉原則。
缺點:
- 相比簡單工廠,實現(xiàn)略復雜。
- 對于某些可以形成產(chǎn)品族的情況處理比較復雜。
適用場景:單個產(chǎn)品且種類不確定容易變化
比如數(shù)據(jù)庫訪問類,不同數(shù)據(jù)庫使用模式可能不一致,但是基礎操作都是增刪改查,產(chǎn)品很多:MySQL、Oracle、SQLite等等并且隨時可能添加一個新的數(shù)據(jù)庫,這個時候
抽象工廠
抽象工廠是應對產(chǎn)品族概念的。
例如,汽車可以分為轎車、SUV、MPV等,也分為奔馳、寶馬等。我們可以將奔馳的所有車看作是一個產(chǎn)品族,而將寶馬的所有車看作是另一個產(chǎn)品族。分別對應兩個工廠,一個是奔馳的工廠,另一個是寶馬的工廠。與工廠方法不同,奔馳的工廠不只是生產(chǎn)具體的某一個產(chǎn)品,而是一族產(chǎn)品(奔馳轎車、奔馳SUV、奔馳MPV)。“抽象工廠”的“抽象”指的是就是這個意思。
上邊的工廠方法模式是一種極端情況的抽象工廠模式(即只生產(chǎn)一種產(chǎn)品的抽象工廠模式),而抽象工廠模式可以看成是工廠方法模式的一種推廣。
如下邊UML類圖所示為抽象工廠。
只有對應產(chǎn)品族的情況下,才需要使用抽象工廠模式。
適用場景:具有產(chǎn)品族抽象規(guī)范(每個工廠都具有同樣類型的產(chǎn)品)且有多個類別的時候。
硬件設備的連接:dell家的鼠標、鍵盤、顯示器;Lenovo家的相同產(chǎn)品等等
區(qū)別
簡單工廠 : 用來生產(chǎn)同一等級結構中的任意產(chǎn)品。(不支持拓展增加產(chǎn)品)
工廠方法 :用來生產(chǎn)同一等級結構中的固定產(chǎn)品。(支持拓展增加產(chǎn)品)
抽象工廠 :用來生產(chǎn)不同產(chǎn)品族的全部產(chǎn)品。(不支持拓展增加產(chǎn)品;支持增加產(chǎn)品族)
注意事項
- 工廠類常常采用單例模式(Singleton)。
- 工廠類擁有基類(定義共同接口),基類可以為純虛類,也可以定義缺省方法。
- 對于工廠方法和抽象工廠,基類中的生產(chǎn)產(chǎn)品的函數(shù)常常為虛函數(shù),以實現(xiàn)動態(tài)綁定。
- 調用工廠方法的函數(shù)通常采用工廠實現(xiàn)的指針和引用作為形參,以便根據(jù)不同的工廠實參調用不同的工廠方法。