版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第Java設(shè)計模式之工廠方法和抽象工廠publicstaticvoidmain(String[]args){
Clientclient=newClient(newSimpleFactory());
client.orderProduct("A");
}
這樣簡單工廠模式就實(shí)現(xiàn)了,這樣的話老王和具體的產(chǎn)品就很好的解耦了,也不需要老王再依賴具體產(chǎn)品類,依賴倒置問題就很好的解決了。
如果增加一個產(chǎn)品D,需要再重新定義一個D類,實(shí)現(xiàn)product接口,而后在工廠類中增加一個分支結(jié)構(gòu)。
顯而易見這樣實(shí)現(xiàn),缺陷依然存在:
1、工廠類集中了所有產(chǎn)品創(chuàng)建邏輯,職責(zé)過重,一旦發(fā)生異常,整個系統(tǒng)將受影響。
2、使用簡單工廠模式將會增加系統(tǒng)中類的個數(shù),在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度。
3、系統(tǒng)擴(kuò)展困難,一旦增加新產(chǎn)品不得不修改工廠邏輯,在產(chǎn)品類型較多時,可能造成邏輯過于復(fù)雜。
4、簡單工廠模式由于使用了靜態(tài)工廠方法,造成工廠角色無法形成基于繼承的等級結(jié)構(gòu)。
這種方法只是一種編碼方式,并不輸入設(shè)計模式的一種,且局限于產(chǎn)品種類較少。
三、工廠方法
在簡單工廠中老王需要具體的產(chǎn)品,就在他自己的類中去創(chuàng)建需要的產(chǎn)品,老王雖然不依賴具體產(chǎn)品,但老王現(xiàn)在需要依賴工廠實(shí)現(xiàn)類了。
簡單工廠是將產(chǎn)品類抽象化,具體的產(chǎn)品由工廠類去實(shí)現(xiàn)。
如果我們將工廠類也抽象化,那就引出了我們今天第一個設(shè)計模式工廠方法。
工廠方法有四個角色:
1、抽象工廠(AbstractFactory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過它訪問具體工廠的工廠方法createProduct()來創(chuàng)建產(chǎn)品。
2、具體工廠(ConcreteFactory):主要是實(shí)現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。
3、抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。
4、具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來創(chuàng)建,它同具體工廠之間一一對應(yīng)。
我們對簡單工廠代碼進(jìn)行改造。
抽象產(chǎn)品父類、產(chǎn)品A類、產(chǎn)品B類保持不變。重點(diǎn)看工廠類
抽象工廠類:
/**
*@authortcy
*@Date28-07-2025
publicabstractclassAbstractFactory{
publicabstractProductcreateProduct(StringorderType);
}
具體實(shí)現(xiàn)工廠A類:
/**
*@authortcy
*@Date28-07-2025
publicclassConcreteFactoryAextendsAbstractFactory{
@Override
publicProductcreateProduct(StringorderType){
System.out.println("參數(shù)為:"+orderType);
returnnewProductA();
}
具體實(shí)現(xiàn)工廠B類:
/**
*@authortcy
*@Date28-07-2025
publicclassConcreteFactoryBextendsAbstractFactory{
@Override
publicProductcreateProduct(StringorderType){
returnnewProductB();
}
老王類:
/**
*@authortcy
*@Date28-07-2025
publicclassClient{
AbstractFactorysimpleFactory;
publicClient(AbstractFactorysimpleFactory){
this.simpleFactory=simpleFactory;
publicProductorderProduct(StringorderType){
Productproduct;
product=simpleFactory.createProduct(orderType);
//調(diào)用每個產(chǎn)出相應(yīng)的方法
mon();
System.out.println(product.getClass());
returnproduct;
publicstaticvoidmain(String[]args){
Clientclient=newClient(newConcreteFactoryA());
client.orderProduct("A");
}
這樣的好處就在于老王只管他要關(guān)注的抽象工廠,具體是哪個工廠實(shí)現(xiàn)類生產(chǎn)產(chǎn)品,老王也不需要關(guān)注。
典型的解耦框架。高層模塊只需要知道產(chǎn)品的抽象類,無須關(guān)心其他實(shí)現(xiàn)類,滿足迪米特法則、依賴倒置原則和里氏替換原則。
缺點(diǎn)也是顯而易見的:
類的個數(shù)容易過多,增加復(fù)雜度。考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度。抽象產(chǎn)品只能生產(chǎn)一種產(chǎn)品。
如果對工廠方法依然一知半解的話,接著往下看工廠方法的一個典型實(shí)現(xiàn)
在JDK中對工廠方法有大量的運(yùn)用,其中比較典型的是
newArrayList().iterator();
我們知道集合的一個大分支依賴的是Collection接口,我們以ArrayList作為舉例。
Collection接口相當(dāng)于產(chǎn)品的抽象父類,ArrayList相當(dāng)于具體產(chǎn)品。
Iterator是一個抽象工廠,在ArrayList中有一個Itr內(nèi)部類實(shí)現(xiàn)了Iterator接口
當(dāng)我們調(diào)用集合的iterator()方法遍歷對象時,就會調(diào)用各自類的具體實(shí)現(xiàn)方法。
四、抽象工廠
有一天,產(chǎn)品A、B、C升級改造了,三種產(chǎn)品分別有紅色和藍(lán)色,如果還用工廠方法的話,那簡直是個災(zāi)難,具體工廠實(shí)現(xiàn)類需要六個。
就引出我們今天的第二個設(shè)計模式抽象工廠。
抽象工廠模式(AbstractFactoryPattern):提供一個接口,用于創(chuàng)建創(chuàng)建一系列相關(guān)或相互依賴對象的家族,而無須指定它們具體的類。抽象工廠模式又稱為Kit模式,屬于對象創(chuàng)建型模式。
抽象工廠模式與工廠方法模式區(qū)別在于,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu)。
而抽象工廠模式則需要面對多個產(chǎn)品等級結(jié)構(gòu)(各種顏色),一個工廠等級結(jié)構(gòu)可以負(fù)責(zé)多個不同產(chǎn)品等級結(jié)構(gòu)(不同顏色)中的產(chǎn)品對象的創(chuàng)建。
抽象工廠依然是四個角色:
AbstractFactory:抽象工廠
ConcreteFactory:具體工廠
AbstractProduct:抽象產(chǎn)品
Product:具體產(chǎn)品
我們開始改造工廠方法代碼,既然是要把產(chǎn)品都分成一組,那理應(yīng)把產(chǎn)品A、B、C都抽象出來,再讓工廠類去實(shí)現(xiàn)各個產(chǎn)品的不同顏色,也就是概念中的用于創(chuàng)建創(chuàng)建一系列相關(guān)或相互依賴對象的家族。
接口看改造后的代碼:
產(chǎn)品抽象類:
/**
*@authortcy
*@Date28-07-2025
publicinterfaceProduct{
publicvoidcommon();
}
產(chǎn)品抽象A家族類:
/**
*@authortcy
*@Date28-07-2025
publicabstractclassProductAimplementsProduct{
publicabstractvoidcommon();
}
產(chǎn)品抽象B家族類:
/**
*@authortcy
*@Date28-07-2025
publicabstractclassProductBimplementsProduct{
publicabstractvoidcommon();
}
具體紅色產(chǎn)品A類:
/**
*@authortcy
*@Date28-07-2025
publicclassRedProductAextendsProductA{
@Override
publicvoidcommon(){
System.out.println("這是紅色的產(chǎn)品A");
}
具體藍(lán)色產(chǎn)品A類:
/**
*@authortcy
*@Date28-07-2025
publicclassBlueProductAextendsProductA{
@Override
publicvoidcommon(){
System.out.println("這是藍(lán)色的產(chǎn)品A");
}
抽象A家族工廠類:
/**
*@authortcy
*@Date28-07-2025
publicinterfaceAbstractProductFactory{
publicProductAcreateProduct(StringorderType);
}
實(shí)現(xiàn)A家族工廠類:
/**
*@authortcy
*@Date28-07-2025
publicclassConcreateProductAFactoryimplementsAbstractProductFactory{
@Override
publicProductAcreateProduct(StringorderType){
returnnewBlueProductA();
}
老王類:
/**
*@authortcy
*@Date28-07-2025
publicclassClient{
ConcreateProductAFactorysimpleFactory;
publicClient(ConcreateProductAFactorysimpleFactory){
this.simpleFactory=simpleFactory;
publicProductAorderProduct(StringorderType){
ProductAproduct;
product=simpleFactory.createProduct(orderType);
//調(diào)用每個產(chǎn)出相應(yīng)的方法
mon();
System.out.println(product.getClass());
returnproduct;
publicstaticvoidmain(String[]args){
Clientclient=newClient(newConcreateProductAFactory());
client.orderProduct("A");
}
這樣的話,每天工廠類可以把A的產(chǎn)品家族類(紅、藍(lán))都實(shí)現(xiàn),抽象工廠模式隔離了具體類的生成,使得老王并不需要知道什么產(chǎn)品被創(chuàng)建,從具體的產(chǎn)品解耦出來。
當(dāng)一個產(chǎn)品族中的多個對象被設(shè)計成一起工作時,它能夠保證客戶端始終只使用同一個產(chǎn)品族中的對象。
如果要增加新產(chǎn)品、和新工廠很容易,如果再增加一個等級(顏色)代碼修改起來就很痛苦了。
抽象工廠模式在Spring中有大量的運(yùn)用。
比較典型的是,BeanFactory是用于管理Bean的一個工廠,所有工廠都是BeanFactory的子類。這樣我們可以通過IOC容器來管理訪問Bean,根據(jù)不同的策略調(diào)用getBean()方法,從而獲得具體對象。
BeanFactor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年寧夏體育職業(yè)學(xué)院單招綜合素質(zhì)考試模擬試題含詳細(xì)答案解析
- 2026年1月黑龍江大慶市肇州縣招聘公益性崗位人員35人考試重點(diǎn)試題及答案解析
- 2026年天津仁愛學(xué)院高職單招職業(yè)適應(yīng)性測試模擬試題及答案詳細(xì)解析
- 2026貴州六盤水六枝特區(qū)面向社會公開招聘事業(yè)單位工作人員35人考試重點(diǎn)題庫及答案解析
- 2026年景德鎮(zhèn)陶瓷職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試備考試題含詳細(xì)答案解析
- 2026年西安市未央?yún)^(qū)漢城社區(qū)衛(wèi)生服務(wù)中心招聘(12人)考試重點(diǎn)題庫及答案解析
- 2026湖南長沙市芙蓉區(qū)教育局屬學(xué)校公開招聘小學(xué)編外合同制教師33人參考考試題庫及答案解析
- 2026年貴州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試備考題庫含詳細(xì)答案解析
- 2026年麗江市招聘事業(yè)單位工作人員(610人)參考考試試題及答案解析
- 2026年九江理工職業(yè)學(xué)院單招職業(yè)技能考試備考題庫含詳細(xì)答案解析
- 空氣栓塞課件教學(xué)
- 2025年國家市場監(jiān)管總局公開遴選公務(wù)員面試題及答案
- 肌骨康復(fù)腰椎課件
- 2026年山東城市服務(wù)職業(yè)學(xué)院單招職業(yè)適應(yīng)性考試題庫附答案詳解
- 患者身份識別管理標(biāo)準(zhǔn)
- 2025年10月自考04184線性代數(shù)經(jīng)管類試題及答案含評分參考
- 2025年勞動保障協(xié)理員三級技能試題及答案
- 20以內(nèi)加減法混合口算練習(xí)題1000道(附答案)
- 全國高考體育單招考試政治模擬試卷試題及答案2025年
- 產(chǎn)品質(zhì)量檢查報告表專業(yè)標(biāo)準(zhǔn)模板版
- 2025年及未來5年中國心血管病醫(yī)院行業(yè)競爭格局及投資戰(zhàn)略研究報告
評論
0/150
提交評論