定義(Definition)
抽象工廠模式爲一個產品家族提供了統一的創建接口。當需要這個產品家族的某一系列的時候,可以從抽象工廠中選出相對的系列來創建一個具體的工廠類別。
動機(Motivation)
在軟件系統中,經常面臨着“一系列相互依賴的對象”的創建工作;同時,由於需求的變化,
往往存在更多系列對象的創建工作。
結構(Structure)
角色(Roles)
抽象工廠(Abstract Factory):聲明一個創建抽象產品對象的接口操作。
具體工廠(Concret Factory):實現創建具體產品對象的操作。
抽象產品(Abstract Product):爲一類產品對象聲明一個接口。
具體產品(Concrete Product):定義一個將被相應的具體工廠創建的產品對象,實現AbstractProduct接口。
Client僅適用由AbstractFatory和AbstractProduct類聲明的接口。
適用情況
1.一個系統要獨立於它的產品的創建、組合和表示時。
2.一個系統要多個產品系列中的一個來配置時。
3.需要強調一系列相關的產品對象的設計以便進行聯合使用時。
4.提供一個產品類庫,而只想顯示它們的接口而不是實現時。
舉例
還是以華爲和OPPO進行舉例,他們可以看做兩個系列,華爲系列,OPPO系列,華爲系列又包括華爲手機產品,華爲平板產品,OPPO系列也同樣包括OPPO手機產品,OPPO平板產品。
圖中ConcreteFactory1爲華爲工廠,ConcreteFactory2爲OPPO工廠
AbstractProductA爲抽象產品手機,AbstractProductB爲抽象產品平板電腦
ProductA1是華爲手機,ProductA2是OPPO手機
ProductB2是OPPO平板,ProductB1是華爲平板
IPhone接口,用來客戶端訪問,解除與具體手機類訪問的耦合,對應於結構圖當中的Abstract ProductA
interface IPhone
{
void Start(); //啓動
void Off(); //關機
}
HuaWeiPhone具體產品類,對應結構圖中的ProductA1
class HuaweiPhone:IPhone
{
public void Start()
{
Console.WriteLine("華爲手機開機了");
}
public void Off()
{
Console.WriteLine("華爲手機關機了");
}
}
OPPOPhone具體產品類,對應結構圖中的ProductA2
class OPPOPhone :IPhone
{
public void Start()
{
Console.WriteLine("OPPO手機開機了");
}
public void Off()
{
Console.WriteLine("OPPO手機關機了");
}
}
ITabletComputer接口,用來客戶端訪問,解除與具體平板類訪問的耦合,對應結構圖中的AbstractProductB
interface ITabletComputer
{
void Start();
}
華爲具體平板產品類,實現平板接口,對應結構圖中的ProductB1
class HuaweiTablet : ITabletComputer
{
public void Start()
{
Console.WriteLine("華爲平板電腦啓動了");
}
}
OPPO具體平板產品類,實現平板接口,對應結構圖中的ProductB2
class OPPOTablet : ITabletComputer
{
public void Start()
{
Console.WriteLine("OPPO平板電腦啓動了");
}
}
定義一個抽象工廠接口,對應結構圖中的Abstract Factory
interface IFactory
{
IPhone CreatePhone();
ITabletComputer CreateTablet();
}
定義HuaweiFactory具體的工廠類,實現IFactory接口,對應結構圖中的ConcreteFactory1
class HuaweiFactory : IFactory
{
public IPhone CreatePhone()
{
return new HuaweiPhone();
}
public ITabletComputer CreateTablet()
{
return new HuaweiTablet();
}
}
定義OPPOFactory具體的工廠類,實現IFactory接口,對應結構圖中的ConcreteFactory2
class OPPOFactory : IFactory
{
public IPhone CreatePhone()
{
return new OPPOPhone();
}
public ITabletComputer CreateTablet()
{
return new OPPOTablet();
}
}
客戶端代碼
IFactory factory = new HuaweiFactory();
IPhone phone = factory.CreatePhone();
phone.Start();
phone.Off();
ITabletComputer tablet = factory.CreateTablet();
tablet.Start();
Console.Read();
運行結果
如果想要創建OPPO系列的手機和平板,只需要改變客戶端的代碼的下面這行就可以了:
IFactory factory = new HuaweiFactory(); → IFactory factory = new OPPOFactory();
運行結果如下
總結:它適用於系列產品,但是它的缺點是難以支持新種類的產品,因爲抽象工廠接口確定了可以被創建的產品集合,所以難以擴展抽象工廠以生產新種類的產品。也就是說,如果現在華爲和OPPO又增加了一個新的業務,生產筆記本電腦,那麼我們需要在抽象工廠接口中增加,而且華爲和OPPO兩個具體工廠也要改變,這就違反了開閉原則。
如有問題,歡迎大家指正~~~