简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比
先看各自的結構:
簡單工廠模式(SimpleFactory Mode):
? ? 簡單工廠模式的思路是,首先我們把一些共性的東西(算法)拿出來,進行抽象,比如加減乘除。然后我們在定義一個類作為工廠類,工廠類的作用就是根據傳過來的字符串或者其他Key值給返回一個相對應的算法的實體。
優點:
? ? 方便擴展算法,比如增加一個開根號的功能,我們只要繼續繼承運算類就行了,同時客戶端也就是使用者不知道具體的實現細節,只要給出相關標示符,工廠函數就馬上給他創建一個他想要的實體就行了。減少了使用者和功能開發者之間的耦合度。
缺點:
? ? 比較明顯,在進行擴展的時候,我們要更改工廠函數里面的那個分支語句Switch,這樣便破壞了OCP,而且當有多級結構繼承的時候,簡單工廠就會因為只能對應平行一層記得繼承,不得不使得好多類繼承同一個接口,然后得到A*B這么多的工廠實體可能,工廠函數很難維護。
工廠方法模式(Factory Method):
? ? 定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
優點:
? ? 算法實體的創建被延遲到了工廠子類里,我們不在工廠里直接創建對象,而是直接封裝一個一個的小工廠,每個工廠負責創建自己的子類,這樣就不存在switch的情況,也就不存在擴展不滿足OCP的這個問題。
?
缺點:
? ? 如果算法種類很多,那么繼承抽象工廠的子類也就會很多,不是很好維護,同時不支持產品切換,比如我們要開發PC,分為多個系統,那么我們可以把所有的系統都抽象出來(類似上面的加減乘除),然后我們在抽象出來工廠,但是如果這個時候我們有兩個硬件呢,PC和Phone,雖然我們可以保證只有這兩個硬件了,但是如果用基本的抽象工廠去實現的話還是很別扭。
抽象工廠模式(Abstract Factory):
? ? 提供一個創建一系列相關或者相互依賴對象的接口,而無需指定它們具體的類。
優點:
? ? 首先是滿足OCP的,而且可以滿足產品切換,能實現的前提是比如A和B兩個產品,它們有1和2兩個方法接口(類),現在我們在增加新的產品C(假設也是只有1和2兩個方法接口),我們要做的只是增加一個產品類再增加一個工廠類就行了,如果是簡單工廠或者是工廠方法的的話通常都是增加兩個算法類C.1,C.2,簡單工廠需要修改switch增加兩個語句,工廠方法是在增加兩個工廠類。可見抽象工廠的優點。
?
缺點:
? ? 顯而易見,太重了。
對比:
? ? 簡單工廠實現簡單,擴展也很容易,但是不滿足OCP,不滿足OCP的代價就是難維護,在維護的時候容易引發新的BUG,相比之下,工廠方法則是把對象的實例化延遲到了繼承的子類里面,這樣可以量或的擴展工廠。擴展的是時候滿足OCP,但是不支持產品切換,也就是只能滿足一層的產品(算法)抽象,而抽象工廠則是繼續把產品進行再次抽象,最后得到一個可以支持產品切換的結構,但問題是太重了,過于復雜,不過還好,很多支持反射的語言,我們可以直接通過反射技術來優化這個“過重”的缺點。當然,也可以用反射來優化前面兩個工廠結構(但是抽象工廠和工廠方法相比,兩者也都只是支持一個地方的可擴展而已,不要誤解為抽象工廠可以擴展兩個地方)。
?
進化:
????????????優化滿足OCP ???????; ???????優化滿足產品切換
簡單工廠 ---------------------------> ?工廠方法 ?--------------------------------> 抽象工廠
退化:
? ? 增加了和客戶端之間的耦合度(客戶端需要知道各種工廠);變得太重了 ???????????????????????????????????
簡單工廠 ---------------------------> ?工廠方法 ?--------------------------------> 抽象工廠
?
總結
以上是生活随笔為你收集整理的简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python第四章-字典
- 下一篇: 设计模式-UML图简单介绍