日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

由浅入深学“工厂模式”(3)

發(fā)布時間:2023/12/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 由浅入深学“工厂模式”(3) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

3.5 抽象工廠模式

我們繼續(xù)對影像家電產(chǎn)品的情形進行分析,我們已經(jīng)可以使用工廠方法比較好的實現(xiàn)了產(chǎn)品的創(chuàng)建,但是在以前的分析中我們并沒有考慮產(chǎn)品種類及生產(chǎn)廠家這樣的問題。就拿DVD來說TCL可以生產(chǎn)、LG也生產(chǎn)等等很多廠家都生產(chǎn)。DVD是產(chǎn)品種類中的一種,產(chǎn)品種類這個概念在有些書上稱為產(chǎn)品族。從另外一個角度來看TCL可以生產(chǎn)DVDVCD等等很多產(chǎn)品,這些產(chǎn)品在一起就可以構(gòu)成一個產(chǎn)品結(jié)構(gòu)。當(dāng)我們考慮了這些問題后,提出了兩個概念:產(chǎn)品種類、產(chǎn)品結(jié)構(gòu)。我們在工廠方法中討論的是一個個單一的產(chǎn)品的創(chuàng)建,如果我們對這個問題進行進一步的研究、拓展,就應(yīng)該從單一的產(chǎn)品過度到多個產(chǎn)品種類,在工廠方法中我們考慮DVD是一個單一的產(chǎn)品,現(xiàn)在我們認(rèn)為DVD是一個產(chǎn)品種類,有TCL生產(chǎn)的DVD,有LG生產(chǎn)的DVDVCD是另一個產(chǎn)品種類,有TCL生產(chǎn)的VCD,有LG生產(chǎn)的VCD。就這個問題我們重新分析,有兩個產(chǎn)品種類分別是DVDVCD,有兩個工廠是TCLLG,它們分別生產(chǎn)DVDVCD。我們使用下面的類圖來表示:




?

DVD是抽象類它提供統(tǒng)一的接口,LGDVDTCLDVD是兩個具體的類。VCDDVD類似。有一個抽象的工廠Create,從它派生了兩個具體的類TCLCreateLGCreateCreate中提供了兩個抽象方法factoryDVDfactoryVCD它們提供了兩個接口,用于創(chuàng)建DVD產(chǎn)品和VCD產(chǎn)品。在TCLCreateLGCreate中實現(xiàn)這兩個方法。這樣TCLCreate就可以創(chuàng)建自己的DVDVCD,同樣LGCreate也可以傳經(jīng)自己的產(chǎn)品。

下面是代碼結(jié)構(gòu):

public abstract class Create

{

???? public abstract DVD factoryDVD();

???? public abstract VCD factoryVCD();

}

?

public class LGCreate: Create

{

???? public override DVD factoryDVD()

???? {

???????? return new LGDVD();

???? }

?

???? public override VCD factoryVCD()

???? {

???????? return new LGVCD();

???? }

}

?

public class TCLCreate: Create

{

???? public override DVD factoryDVD()

???? {

???????? return new TCLDVD();

???? }

?

???? public override VCD factoryVCD()

???? {

???????? return new TCLVCD();

???? }

}

?

public abstract class DVD

{

???? public abstract string PlayVideo();

}

?

public class LGDVD: DVD

{

???? public override string PlayVideo()

???? {

???????? return "LG的DVD在播放";

???? }

}

?

public class TCLDVD: DVD

{

???? public override string PlayVideo()

???? {

???????? return "TCL的DVD正在播放";

???? }

}

?

public abstract class VCD

{

???? public abstract string PlayVideo();

}

?

public class LGVCD: VCD

{

???? public override string PlayVideo()

???? {

???????? return "LG的VCD正在播放";

???? }

}

?

public class TCLVCD: VCD

{

???? public override string PlayVideo()

???? {

???????? return "TCL的VCD正在播放";

???? }

}

?

客戶端使用抽象工廠代碼如下:

???? ???? private void button1_Click(object sender, System.EventArgs e)

???????? {

???????? ???? Create TCL,LG;

???????? ???? TCL=new TCLCreate();

???????? ???? LG=new LGCreate();

???????? ???? PlayDVD(TCL);?? //輸出“TCL的DVD在播放”

???????? ??? PlayDVD(LG);???? //輸出“LG的DVD在播放”

?

???????? }

???? ???? private void PlayDVD(Create create)

???????? {

???????? ???? DVD dvd=create.factoryDVD();

???????? ???? MessageBox.Show(dvd.PlayVideo());

???????? }

?

下面將抽象工廠模式推廣到一般情況,它的類圖如下所示:


?

抽象工廠:提供所有具體工廠的接口,與應(yīng)用系統(tǒng)的具體商業(yè)邏輯無關(guān)。基本上為每一個產(chǎn)品種類提供一個創(chuàng)建方法。

具體工廠:具體負(fù)責(zé)創(chuàng)建產(chǎn)品結(jié)構(gòu)中每個產(chǎn)品。它包含了創(chuàng)建不同產(chǎn)品的商業(yè)邏輯。它實現(xiàn)抽象工廠中的接口。

抽象產(chǎn)品:定義產(chǎn)品的共同接口。

具體產(chǎn)品:是客戶需要創(chuàng)建的具體對象。

?

在工廠方法中每個工廠負(fù)責(zé)創(chuàng)建一個產(chǎn)品,在抽象工廠中每個工廠創(chuàng)建一系列產(chǎn)品。在上面舉例中使用TCLLG這樣的實際的工廠,在實際的應(yīng)用中,往往是我們根據(jù)產(chǎn)品抽象了類,它們主要負(fù)責(zé)一系列產(chǎn)品的創(chuàng)建,將這些負(fù)責(zé)抽象工廠的類稱為具體工廠,從這些具體工廠更進一步進行抽象,抽象出的工廠稱為抽象工廠。下面我們看看抽象工廠模式的擴展。

?

抽象工廠的擴展包括了新增一個產(chǎn)品種類及新增一個工廠。當(dāng)在現(xiàn)有的抽象產(chǎn)品下添加新的具體產(chǎn)品時我們僅僅需要增加一個新的工廠就可以。比如現(xiàn)在有了Haier(海爾)的DVDVCD,我們很容易就實現(xiàn)擴展,而且也滿足了“開閉原則”。如下圖所示:



?

當(dāng)我們有了一個新的產(chǎn)品的增加的時候,就不能很好的滿足“開閉原則”了,因為我們需要修改每個產(chǎn)出的方法從而是現(xiàn)有的工廠可以創(chuàng)建出新的產(chǎn)品。比如我們增加一個Mp4產(chǎn)品種類。


轉(zhuǎn)載于:https://www.cnblogs.com/hobe/archive/2005/11/07/271026.html

總結(jié)

以上是生活随笔為你收集整理的由浅入深学“工厂模式”(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。