提供一個建立一系列相關或互相依賴的對象的接口,而無需指定具體的類。
目錄
- 定義
- UML類圖
- 參與者
- 編寫代碼
- 特點
使用頻率:

AbstractFactory:聲明一個建立抽象産品的的接口。
ConcreteFactory:實作接口建立具體的産品對象。
AbstractProduct:産品的抽象。
Product:具體的産品,實作抽象産品的接口。
Client:使用抽象工廠和抽象産品。
1.建立控制台程式AbstractFactory,新增Abstract.cs類檔案
using System;
/// <summary>
/// 抽象工程模式:提供一個建立一系列相關或互相依賴對象的接口,而無須指定具體的類。
/// </summary>
namespace AbstractFactory
{
/// <summary>
/// 抽象産品A
/// </summary>
public abstract class AbstractProductA
{
public abstract void SayHello();
}
/// <summary>
/// 抽象産品B
/// </summary>
public abstract class AbstractProductB
{
public abstract void SayHello();
}
/// <summary>
/// 具體産品A1
/// </summary>
public class ProductA1 : AbstractProductA
{
public override void SayHello()
{
Console.WriteLine("Hello,我是具體産品A1");
}
}
/// <summary>
/// 具體産品A2
/// </summary>
public class ProductA2 : AbstractProductA
{
public override void SayHello()
{
Console.WriteLine("Hello,我是具體産品A2");
}
}
/// <summary>
/// 具體産品B1
/// </summary>
public class ProductB1 : AbstractProductB
{
public override void SayHello()
{
Console.WriteLine("Hello,我是具體産品B1");
}
}
/// <summary>
/// 具體産品B2
/// </summary>
public class ProductB2 : AbstractProductB
{
public override void SayHello()
{
Console.WriteLine("Hello,我是具體産品B2");
}
}
/// <summary>
/// 抽象工廠:提供建立抽象産品的接口
/// </summary>
public abstract class AbstractFactory
{
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();
}
/// <summary>
/// 具體工廠:實作抽象工廠建立産品的接口
/// </summary>
public class ConcreteFactory1 : AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA1();
}
public override AbstractProductB CreateProductB()
{
return new ProductB1();
}
}
public class ConcreteFactory2 : AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA2();
}
public override AbstractProductB CreateProductB()
{
return new ProductB2();
}
}
public class Client
{
private AbstractProductA _productA;
private AbstractProductB _productB;
public Client(AbstractFactory factory)
{
_productA = factory.CreateProductA();
_productB = factory.CreateProductB();
}
public void Run()
{
_productA.SayHello();
_productB.SayHello();
}
}
}
2.編寫Program.cs
using System;
namespace AbstractFactory
{
class Program
{
static void Main(string[] args)
{
//使用工廠1
AbstractFactory factory = new ConcreteFactory1();
Client client = new Client(factory);//依賴注入
client.Run();
Console.WriteLine();
//使用工廠2
factory = new ConcreteFactory2();
client = new Client(factory);
client.Run();
Console.Read();
}
}
}
3.輸出結果
1) 分離了具體的類
Abstract Factory 模式幫助你控制一個應用建立的對象的類。因為一個工廠封裝建立産品對象的責任和過程,它将客戶與類的實作分離。客戶通過它們的抽象接口操縱執行個體。産品的類名也在具體工廠的實作中被分離;它們不出現在客戶代碼中。
2) 使得易于交換産品系列
一個具體工廠類在一個應用中僅出現一次—即在它初始化的時候。這使得改變一個應用的具體工廠變得很容易。它隻需改變具體的工廠即可使用不同的産品配置,這是因為一個抽象工廠建立了一個完整的産品系列,是以整個産品系列會立刻改變。
3) 有利于産品的一緻性
當一個系列中的産品對象被設計成一起工作時,一個應用一次隻能使用同一個系列中的對象,這一點很重要。而AbstractFactory很容易實作這一點。
4) 難以支援新種類的産品
難以擴充抽象工廠以生産新種類的産品,這是因為AbstractFactory接口确定了可以被建立的産品集合。 支援新種類的産品就需要擴充該工廠接口,這将涉及 AbstractFactory類及其所有子類的改變。
我叫劉皓,很高興您能閱讀完我的這篇文章。
我花了大量時間和精力來完成這篇文章,如果文章對您有幫助,請不要忘了點推薦哦!
如果您能點選右邊的打賞按鈕,打賞一杯咖啡錢,我将獲得更多的動力和能量寫出下一篇好文章。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利。
我的部落格即将搬運同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan