由浅入深学“工厂模式”(3)
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)DVD、VCD等等很多產(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)的DVD,VCD是另一個產(chǎn)品種類,有TCL生產(chǎn)的VCD,有LG生產(chǎn)的VCD。就這個問題我們重新分析,有兩個產(chǎn)品種類分別是DVD、VCD,有兩個工廠是TCL和LG,它們分別生產(chǎn)DVD和VCD。我們使用下面的類圖來表示:
?
DVD是抽象類它提供統(tǒng)一的接口,LGDVD、TCLDVD是兩個具體的類。VCD和DVD類似。有一個抽象的工廠Create,從它派生了兩個具體的類TCLCreate、LGCreate。Create中提供了兩個抽象方法factoryDVD和factoryVCD它們提供了兩個接口,用于創(chuàng)建DVD產(chǎn)品和VCD產(chǎn)品。在TCLCreate、LGCreate中實現(xiàn)這兩個方法。這樣TCLCreate就可以創(chuàng)建自己的DVD、VCD,同樣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)品。在上面舉例中使用TCL、LG這樣的實際的工廠,在實際的應(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(海爾)的DVD及VCD,我們很容易就實現(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)容,希望文章能夠幫你解決所遇到的問題。