工廠模式
工廠模式是一種創(chuàng)建者設(shè)計(jì)模式,細(xì)分之下可以分成三類(lèi)簡(jiǎn)單工廠模式
,工廠方法模式
和抽象工廠模式
。
簡(jiǎn)單工廠模式
最簡(jiǎn)單的工廠模式,它采用靜態(tài)方法的方式來(lái)決定應(yīng)該應(yīng)該生產(chǎn)什么商品。
public class StoreFactory {
public static ICommodity getCommodityService(Integer commodityType) {
if (null == commodityType) {
return null;
}
switch (commodityType) {
case 1:
return new CouponCommodityService();
case 2:
return new GoodsCommodityService();
case 3:
return new CardCommodityService();
}
throw new RuntimeException("不存在的商品服務(wù)類(lèi)型");
}
}
它的優(yōu)點(diǎn)在于
- 將創(chuàng)建實(shí)例的工作與使用實(shí)例的工作分開(kāi),使用者不必關(guān)心類(lèi)對(duì)象如何創(chuàng)建,實(shí)現(xiàn)了解耦
- 把初始化實(shí)例時(shí)的工作放到工廠里進(jìn)行,使代碼更容易維護(hù),更符合面向?qū)ο蟮脑瓌t
面向接口編程,而不是面向?qū)崿F(xiàn)編程
它的缺點(diǎn)在于文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-695234.html
- 工廠類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯,一旦這個(gè)工廠不能正常工作,整個(gè)系統(tǒng)都會(huì)受到影響
- 違背
開(kāi)閉原則
,一旦添加新的產(chǎn)品就不得不修改工廠類(lèi)的邏輯,這樣就會(huì)造成工廠邏輯過(guò)于復(fù)雜 - 簡(jiǎn)單工廠模式使用了靜態(tài)工廠方法,靜態(tài)方法不能被繼承和重寫(xiě),會(huì)造成工廠角色無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)
它適用于文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-695234.html
- 客戶只知道傳入工廠類(lèi)的參數(shù),對(duì)于如何創(chuàng)建對(duì)象的邏輯不關(guān)心時(shí);
- 當(dāng)工廠類(lèi)負(fù)責(zé)創(chuàng)建的對(duì)象比較少時(shí)。
工廠方法模式
工廠方法模式
中,工廠父類(lèi)負(fù)責(zé)定義創(chuàng)建對(duì)象的公共接口,而子類(lèi)則負(fù)責(zé)生成具體的對(duì)象。
它把類(lèi)的實(shí)例化延遲到工廠類(lèi)的子類(lèi)中,由子類(lèi)來(lái)決定應(yīng)該實(shí)例化哪個(gè)類(lèi)。
由此,它解決了簡(jiǎn)單工廠模式違背了開(kāi)閉原則
的問(wèn)題。
它的優(yōu)點(diǎn)在于
- 更符合
開(kāi)閉原則
- 符合
單一責(zé)任原則
,每個(gè)具體工廠類(lèi)只負(fù)責(zé)創(chuàng)建對(duì)應(yīng)的產(chǎn)品 - 不使用靜態(tài)工廠方法,可以形成基于繼承的等級(jí)結(jié)構(gòu)
它的缺點(diǎn)在于
- 需要的類(lèi)的數(shù)量非常多,每添加一個(gè)新產(chǎn)品,就要相應(yīng)的添加一個(gè)新的工廠。
- 雖然保證了工廠方法內(nèi)的對(duì)修改關(guān)閉,但對(duì)于使用工廠方法的類(lèi),如果要更換另一種產(chǎn)品,仍然需要修改實(shí)例化的具體工廠類(lèi)
- 一個(gè)工廠只能創(chuàng)建一種具體產(chǎn)品
它適用于:
- 當(dāng)一個(gè)類(lèi)不需要知道它所需要的對(duì)象的類(lèi)時(shí)
- 當(dāng)一個(gè)類(lèi)希望通過(guò)其子類(lèi)來(lái)指定創(chuàng)建對(duì)象時(shí)
- 將創(chuàng)建對(duì)象的任務(wù)委托給多個(gè)工廠子類(lèi)中的某一個(gè),客戶端在使用時(shí)無(wú)須關(guān)心是哪一個(gè)工廠子類(lèi)創(chuàng)建產(chǎn)品子類(lèi),需要時(shí)再動(dòng)態(tài)指定,可將具體工廠的類(lèi)名存儲(chǔ)在配置文件或數(shù)據(jù)庫(kù)中(比如spring中的FactoryBean)
抽象工廠模式
抽象工廠模式
定義了一個(gè)能生產(chǎn)一個(gè)產(chǎn)品族
的超級(jí)抽象工廠,然后交給子類(lèi)工廠去生產(chǎn)某一個(gè)產(chǎn)品族
的產(chǎn)品。
產(chǎn)品族和產(chǎn)品等級(jí)
產(chǎn)品等級(jí)結(jié)構(gòu)
既是產(chǎn)品的繼承結(jié)構(gòu)。比如一個(gè)抽象類(lèi)是電視機(jī),其子類(lèi)有海爾電視機(jī)、TCL電視機(jī),則抽象電視機(jī)與具體品牌的電視機(jī)之間構(gòu)成了一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。
產(chǎn)品族
是指由同一個(gè)工廠生產(chǎn)的,位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中的一組產(chǎn)品,如海爾生產(chǎn)的海爾電視機(jī)、海爾洗衣機(jī)和海爾冰箱,構(gòu)成了一個(gè)產(chǎn)品族。
設(shè)計(jì)模式詳解
圖中,IProductFactory
是工廠接口,定義了生產(chǎn)手機(jī)和路由器組成的產(chǎn)品族的方法。而子類(lèi)工廠HuaweiFactory
負(fù)責(zé)生產(chǎn)華為產(chǎn)品族,XiaomiFactory
負(fù)責(zé)生產(chǎn)小米產(chǎn)品族。
另外,IPhoneProduct
和IRouterProduct
分別定義了手機(jī)和路由器兩個(gè)產(chǎn)品等級(jí)。
它的優(yōu)點(diǎn)在于
- 一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象
- 可以很方便地添加一個(gè)新的產(chǎn)品族
它的缺點(diǎn)在于
- 產(chǎn)品族的拓展非常困難,要增加一個(gè)系列的某一個(gè)產(chǎn)品,既要修改工廠抽象類(lèi)里添加代碼,又要在具體的實(shí)現(xiàn)類(lèi)里面添加代碼
- 增加了系統(tǒng)的抽象性和理解難度
它適用于
- 一系列相關(guān)產(chǎn)品對(duì)象(屬于同一產(chǎn)品族)一起創(chuàng)建時(shí)需要大量的重復(fù)代碼
- 提供一個(gè)產(chǎn)品類(lèi)的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使得客戶端不依賴于具體的實(shí)現(xiàn)
到了這里,關(guān)于學(xué)習(xí)筆記-設(shè)計(jì)模式-創(chuàng)建型模式-工廠模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!