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