轉載并補充自:https://www.cnblogs.com/qiaoconglovelife/p/5750290.html
簡單工廠
工廠類(SimpleFactory)擁有一個工廠方法(create)谷遂,接受了一個參數,通過不同的參數實例化不同的產品類卖鲤。
優(yōu)點:
- 很明顯,簡單工廠的特點就是“簡單粗暴”白对,通過一個含參的工廠方法换怖,我們可以實例化任何產品類,上至飛機火箭蟀瞧,下至土豆面條条摸,無所不能铸屉。所以簡單工廠有一個別名:上帝類。
缺點:
- 任何”東西“的子類都可以被生產顷啼,負擔太重。當所要生產產品種類非常多時钙蒙,工廠方法的代碼量可能會很龐大。
- 在遵循開閉原則(對拓展開放躬厌,對修改關閉)的條件下竞帽,簡單工廠對于增加新的產品,無能為力屹篓。因為增加新產品只能通過修改工廠方法來實現疙渣。
適用場景:單個產品且種類較少且固定
抽象類別比較少的時候妄荔,比如http傳輸方式只有GET和POST
工廠方法正好可以解決簡單工廠的這兩個缺點恳邀。
工廠方法模式
工廠方法是針對每一種產品提供一個工廠類。通過不同的工廠實例來創(chuàng)建不同的產品實例刷钢。
優(yōu)點:
- 工廠方法模式就很好的減輕了工廠類的負擔,把某一類/某一種東西交由一個工廠生產内地;(對應簡單工廠的缺點1)
- 同時增加某一類”東西“并不需要修改工廠類,只需要添加生產這類”東西“的工廠即可阱缓,使得工廠類符合開放-封閉原則荆针。
缺點:
- 相比簡單工廠,實現略復雜航背。
- 對于某些可以形成產品族的情況處理比較復雜。
適用場景:單個產品且種類不確定容易變化
比如數據庫訪問類玖媚,不同數據庫使用模式可能不一致,但是基礎操作都是增刪改查勺像,產品很多:MySQL、Oracle吟宦、SQLite等等并且隨時可能添加一個新的數據庫督函,這個時候
抽象工廠
抽象工廠是應對產品族概念的激挪。
例如,汽車可以分為轎車垄分、SUV薄湿、MPV等,也分為奔馳吆倦、寶馬等。我們可以將奔馳的所有車看作是一個產品族蚕泽,而將寶馬的所有車看作是另一個產品族须妻。分別對應兩個工廠荒吏,一個是奔馳的工廠绰更,另一個是寶馬的工廠动知。與工廠方法不同盒粮,奔馳的工廠不只是生產具體的某一個產品丹皱,而是一族產品(奔馳轎車摊崭、奔馳SUV呢簸、奔馳MPV)「蛴“抽象工廠”的“抽象”指的是就是這個意思替裆。
上邊的工廠方法模式是一種極端情況的抽象工廠模式(即只生產一種產品的抽象工廠模式)辆童,而抽象工廠模式可以看成是工廠方法模式的一種推廣把鉴。
如下邊UML類圖所示為抽象工廠汉形。
只有對應產品族的情況下概疆,才需要使用抽象工廠模式逗威。
適用場景:具有產品族抽象規(guī)范(每個工廠都具有同樣類型的產品)且有多個類別的時候。
硬件設備的連接:dell家的鼠標凯旭、鍵盤、顯示器;Lenovo家的相同產品等等
區(qū)別
簡單工廠 : 用來生產同一等級結構中的任意產品。(不支持拓展增加產品)
工廠方法 :用來生產同一等級結構中的固定產品计螺。(支持拓展增加產品)
抽象工廠 :用來生產不同產品族的全部產品登馒。(不支持拓展增加產品陈轿;支持增加產品族)
注意事項
- 工廠類常常采用單例模式(Singleton)。
- 工廠類擁有基類(定義共同接口)蛾娶,基類可以為純虛類茫叭,也可以定義缺省方法半等。
- 對于工廠方法和抽象工廠莽囤,基類中的生產產品的函數常常為虛函數,以實現動態(tài)綁定。
- 調用工廠方法的函數通常采用工廠實現的指針和引用作為形參最筒,以便根據不同的工廠實參調用不同的工廠方法。