當系統需要建立的產品屬於多個產品等級結構(Product Hierarchies),且這些產品必須搭配使用(同屬一個產品族)時,單純的工廠方法模式已不足夠。抽象工廠模式提供一個統一介面,讓客戶端無須知道具體產品類別,即可建構整個產品族。
| 角色 | 說明 | 典型實作 |
|---|---|---|
| Abstract Factory(抽象工廠) | 定義建立各類產品的介面,核心契約 | 介面或抽象類別 |
| Concrete Factory(具體工廠) | 實作抽象工廠,含具體產品建構邏輯 | 具體類別 |
| Abstract Product(抽象產品) | 產品族中各類產品的父介面/基類 | 介面或抽象類別 |
| Concrete Product(具體產品) | 客戶端實際使用的產品實例 | 具體類別 |
public interface IProductA { }
public interface IProductB { }
// 族系 1
public class ProductA1 : IProductA { public ProductA1() { } }
public class ProductB1 : IProductB { public ProductB1() { } }
// 族系 2
public class ProductA2 : IProductA { public ProductA2() { } }
public class ProductB2 : IProductB { public ProductB2() { } }
public interface ICreator
{
IProductA FactoryA();
IProductB FactoryB();
}
public class ConcreteCreator1 : ICreator
{
public IProductA FactoryA() => new ProductA1();
public IProductB FactoryB() => new ProductB1();
}
public class ConcreteCreator2 : ICreator
{
public IProductA FactoryA() => new ProductA2();
public IProductB FactoryB() => new ProductB2();
}
ICreator (介面)
▲
│ 實作
ConcreteCreator1 ──────► ProductA1 (IProductA)
│ ProductB1 (IProductB)
│
ConcreteCreator2 ──────► ProductA2 (IProductA)
ProductB2 (IProductB)
客戶端僅持有 ICreator 參考,透過 DI 或設定檔注入具體工廠,即可切換整個產品族,達到開放封閉原則。
建議先理解簡單工廠與工廠方法模式,再進階至抽象工廠。實務上常搭配依賴注入容器(如 ASP.NET Core 內建 DI)管理工廠實例生命週期。