由浅入深学“工厂模式”(3)
3.5 抽象工廠模式
我們繼續對影像家電產品的情形進行分析,我們已經可以使用工廠方法比較好的實現了產品的創建,但是在以前的分析中我們并沒有考慮產品種類及生產廠家這樣的問題。就拿DVD來說TCL可以生產、LG也生產等等很多廠家都生產。DVD是產品種類中的一種,產品種類這個概念在有些書上稱為產品族。從另外一個角度來看TCL可以生產DVD、VCD等等很多產品,這些產品在一起就可以構成一個產品結構。當我們考慮了這些問題后,提出了兩個概念:產品種類、產品結構。我們在工廠方法中討論的是一個個單一的產品的創建,如果我們對這個問題進行進一步的研究、拓展,就應該從單一的產品過度到多個產品種類,在工廠方法中我們考慮DVD是一個單一的產品,現在我們認為DVD是一個產品種類,有TCL生產的DVD,有LG生產的DVD,VCD是另一個產品種類,有TCL生產的VCD,有LG生產的VCD。就這個問題我們重新分析,有兩個產品種類分別是DVD、VCD,有兩個工廠是TCL和LG,它們分別生產DVD和VCD。我們使用下面的類圖來表示:
?
DVD是抽象類它提供統一的接口,LGDVD、TCLDVD是兩個具體的類。VCD和DVD類似。有一個抽象的工廠Create,從它派生了兩個具體的類TCLCreate、LGCreate。Create中提供了兩個抽象方法factoryDVD和factoryVCD它們提供了兩個接口,用于創建DVD產品和VCD產品。在TCLCreate、LGCreate中實現這兩個方法。這樣TCLCreate就可以創建自己的DVD、VCD,同樣LGCreate也可以傳經自己的產品。
下面是代碼結構:
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());
???????? }
?
下面將抽象工廠模式推廣到一般情況,它的類圖如下所示:
?
抽象工廠:提供所有具體工廠的接口,與應用系統的具體商業邏輯無關。基本上為每一個產品種類提供一個創建方法。
具體工廠:具體負責創建產品結構中每個產品。它包含了創建不同產品的商業邏輯。它實現抽象工廠中的接口。
抽象產品:定義產品的共同接口。
具體產品:是客戶需要創建的具體對象。
?
在工廠方法中每個工廠負責創建一個產品,在抽象工廠中每個工廠創建一系列產品。在上面舉例中使用TCL、LG這樣的實際的工廠,在實際的應用中,往往是我們根據產品抽象了類,它們主要負責一系列產品的創建,將這些負責抽象工廠的類稱為具體工廠,從這些具體工廠更進一步進行抽象,抽象出的工廠稱為抽象工廠。下面我們看看抽象工廠模式的擴展。
?
抽象工廠的擴展包括了新增一個產品種類及新增一個工廠。當在現有的抽象產品下添加新的具體產品時我們僅僅需要增加一個新的工廠就可以。比如現在有了Haier(海爾)的DVD及VCD,我們很容易就實現擴展,而且也滿足了“開閉原則”。如下圖所示:
?
當我們有了一個新的產品的增加的時候,就不能很好的滿足“開閉原則”了,因為我們需要修改每個產出的方法從而是現有的工廠可以創建出新的產品。比如我們增加一個Mp4產品種類。
轉載于:https://www.cnblogs.com/hobe/archive/2005/11/07/271026.html
總結
以上是生活随笔為你收集整理的由浅入深学“工厂模式”(3)的全部內容,希望文章能夠幫你解決所遇到的問題。