C#設計模式02-抽象工廠模式(附原始碼)
抽象工廠模式是所有工廠模式中最為抽象的模式,是抽象程度最高的模式,也是最難理解的一種工廠模式。
現在舉一個生活中的案例來說明抽象工廠模式,電視是我們生活中必不可說的電器,但是電視有很多廠家,海爾工廠,海信工廠,美的工廠他們都生產自己的電視(海爾電視,海信電視,美的電視)。再有冰箱,這三個廠家又可以生產自己的冰箱(海爾冰箱,海信冰箱,美的冰箱)。等等......在抽象工廠模式中,海爾電視,海爾冰箱,海爾空調等組成的就是一個產品族
所以在抽象工廠模式中,包含以下四種角色:
(1)抽象工廠(抽象工廠類):它是所有具體工廠的父類,聲明瞭建立一個產品族的方法,並由其子類去實現。抽象工廠可以宣告成介面。
(2)具體工廠(海爾工廠,海信工廠,美的工廠):它們實現了抽象工廠中宣告的方法,生產出一個產品族(比如:海爾電視,海爾冰箱,海爾空調等一系列海爾產品)。
(3)抽象產品:(如抽象電視類)它是所有具體產品的父類。宣告所有具體產品的公共方法。抽象產品宣告成介面。
(4)具體產品(海爾電視,海信電視,美的電視):它們實現了抽象父類中宣告的方法。也是客戶端最終想要的產品。
下面來看看抽象工廠的類圖吧:
總之一點,在抽象工廠模式中,客戶端必須針對介面程式設計,絕對不能針對具體的實現類程式設計。否則無法保證程式的擴充套件性和靈活性。不僅僅抽象工廠,在其他的工廠模式中也都是針對介面(抽象)程式設計!
接下來來看看具體的實現程式碼吧。
首先是抽象產品(抽象電視,抽象冰箱)的程式碼:
namespace 抽象工廠模式
{
interface AbstractTV//所有電視的父類
{
void DisPlay();//顯示電視型別
}
}
namespace 抽象工廠模式
{
interface AbstractBX//所有冰箱的父類
{
void Display();//顯示冰箱型別
}
}
接下來是所有的具體產品的程式碼(海爾電視,海信電視,美的電視和海爾冰箱,海信冰箱,美的冰箱)
namespace 抽象工廠模式
{
class HaiErTV:AbstractTV//海爾電視
{
public void DisPlay()
{
Console.WriteLine("我是海爾電視!");
}
}
}
namespace 抽象工廠模式
{
class HaiXinTV:AbstractTV//海信電視
{
public void DisPlay()
{
Console.WriteLine("我是海信電視!");
}
}
}
namespace 抽象工廠模式
{
class MeiDiTV:AbstractTV//美的電視
{
public void DisPlay()
{
Console.WriteLine("我是美的電視!");
}
}
}
namespace 抽象工廠模式
{
class HaiErBX:AbstractBX//海爾冰箱
{
public void Display()
{
Console.WriteLine("我是海爾冰箱!");
}
}
}
namespace 抽象工廠模式
{
class HaiXinBX:AbstractBX//海信冰箱
{
public void Display()
{
Console.WriteLine("我是海信冰箱!");
}
}
}
namespace 抽象工廠模式
{
class MeiDiBX:AbstractBX//美的冰箱
{
public void Display()
{
Console.WriteLine("我是美的冰箱!");
}
}
}
抽象工廠的程式碼如下:
namespace 抽象工廠模式
{
interface AbstractFactory//所有工廠的父類
{
AbstractBX CreateBX();//建立冰箱
AbstractTV CreateTV();//穿件電視
}
}
最後是具體工廠的(海爾工廠,海信工廠)的程式碼
namespace 抽象工廠模式
{
class HaiErFactory:AbstractFactory//海爾工廠
{
public AbstractBX CreateBX()//建立海爾冰箱
{
return new HaiErBX();
}
public AbstractTV CreateTV()//建立海爾電視
{
return new HaiErTV();
}
}
}
namespace 抽象工廠模式
{
class HaiXinFactory:AbstractFactory//海信工廠
{
public AbstractBX CreateBX()//建立海信冰箱
{
return new HaiXinBX();
}
public AbstractTV CreateTV()//建立海信電視
{
return new HaiXinTV();
}
}
}
還有客戶端的程式碼:
namespace 抽象工廠模式
{
class Program
{
static void Main(string[] args)
{
AbstractBX bx;
//從配置檔案中獲取工廠名
string factoryName = ConfigurationManager.AppSettings["factory"];
//通過反射動態載入程式集,建立工廠例項
AbstractFactory factory = (AbstractFactory)Assembly.Load("抽象工廠模式").CreateInstance(factoryName);
bx = factory.CreateBX();
bx.Display();
Console.ReadLine();
}
}
}
配置檔案的程式碼如下:
<appSettings>
<add key="factory" value="抽象工廠模式.MeiDiFactory"/>
</appSettings>
程式的執行結果如下:
到這裡抽象工廠模式就給大家介紹完了。最後再簡單介紹一下抽象工廠的優缺點:
優點:抽象工廠在增加產品族的時候,很多好的符合了開閉原則。因為只需要增加具體產品和一個物件的具體工廠即可。不需要修改原始碼。可以提供一個視覺化介面,允許使用者修改配置檔案來修改工廠。
缺點:如果要增加一個產品等級結構,就需要修改幾乎所有的程式碼。在上面的程式碼中說到了電視,冰箱。如果現在要增加一個抽象空調——海爾空調,海信空調,美的 空調。就需要在抽象工廠中新增建立空調的方法,在所有的具體工廠中實現該方法,如果你係統中工廠類過多,顯然會給修改帶來很大的麻煩。這嚴重違背了開閉原則。也是抽象工廠最大的缺點所在。所以抽象工廠的使用一定要謹慎。以免給後期維護帶來諸多麻煩。
原始碼下載地址:連結:http://pan.baidu.com/s/1hrw7M2w 密碼:wps7
下一節將給大家介紹建造者模式