Java設(shè)計模式之工廠方法和抽象工廠_第1頁
Java設(shè)計模式之工廠方法和抽象工廠_第2頁
Java設(shè)計模式之工廠方法和抽象工廠_第3頁
Java設(shè)計模式之工廠方法和抽象工廠_第4頁
Java設(shè)計模式之工廠方法和抽象工廠_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論