Abstract Factory Pattern (抽象工廠模式) 是一種 Creational Design Pattern (創建型設計模式)。它提供一個介面,用於創建一系列相關或相互依賴的物件,而不需要指定其實體類別。這樣可以隔離實體類別的變化,使得程式碼更容易擴展和維護。

簡介

  1. 模式名稱

Abstract Factory Pattern

  1. 問題

當需要創建一系列相關或相互依賴的物件時,如果直接在程式碼中使用實體類別,會導致程式碼的脆弱性,使得程式碼難以擴展和維護。

  1. 解決方案

使用 Abstract Factory Pattern,將實體類別隱藏在介面後面,使用工廠方法來創建物件,讓客戶端程式碼只關注介面,而不是具體實現,從而隔離了具體實現的變化。

  1. 結果

使程式碼更容易擴展和維護,提高程式碼的可讀性和可靠性。

在 C# 中實現 Abstract Factory Pattern 的重點如下:

  1. 創建一個抽象工廠介面 (Abstract Factory Interface),該介面定義了創建一系列相關物件的方法。
public interface IFoodFactory
{
    INoodle CreateNoodle();
    ISashimi CreateSashimi();
}
  1. 創建一系列相關的產品介面 (Product Interfaces),每個介面定義了該產品所具有的方法。
public interface INoodle
{
    void Cook();
}

public interface ISashimi
{
    void Cook();
}
  1. 創建一系列實體產品類別 (Concrete Product Classes),實現產品介面定義的方法。

public class Ramen : INoodle
{
    public void Cook()
    {
        Console.WriteLine("Cooking Ramen...");
    }
}

public class Tuna : ISashimi
{
    public void Cook()
    {
        Console.WriteLine("Cooking Tuna...");
    }
}
  1. 創建一個工廠實作類別 (Abstract Factory Implementation),該類別實現了抽象工廠介面,並且返回實體的產品類別實例。
public class JapaneseFoodFactory : IFoodFactory
{
    public INoodle CreateNoodle()
    {
        return new Ramen();
    }

    public ISashimi CreateSashimi()
    {
        return new Tuna();
    }
}
  1. 在客戶端程式碼中,使用抽象工廠介面來創建產品,而不是直接使用具體類別。
public class Client
{
    private IFoodFactory _factory;

    public Client(IFoodFactory factory)
    {
        _factory = factory;
    }

    public void Cook()
    {
        INoodle Ramen = _factory.CreateNoodle();
        ISashimi Tuna = _factory.CreateSashimi();

        Ramen.Cook();
        Tuna.Cook();
    }
}
  1. 在主程式中,創建具體工廠介面的實例,並將其傳遞給客戶端程式碼中的構造函數。
public static void Main()
{
    IFoodFactory taiwaneseFactory = new TaiwaneseFoodFactory();
    Client client = new Client(taiwaneseFactory);
    client.Cook();
}

這樣就完成了 Abstract Factory Pattern 的實現。

以下是幾種初始化抽象工廠的方式:

直接使用具體的工廠實現類別。

IFoodFactory factory = new JapaneseFoodFactory();

使用反射機制動態創建工廠實現類別。

string factoryName = ConfigurationManager.AppSettings["IFoodFactory"];
Type factoryType = Type.GetType(factoryName);
IFoodFactory factory = (IFoodFactory)Activator.CreateInstance(factoryType);

使用 DI 容器創建工廠實現類別。

services.AddTransient<IFoodFactory, JapaneseFoodFactory>();

以上是 Abstract Factory Pattern 的簡介和實現方式,以及幾種初始化抽象工廠的方式。希望對您有所幫助。