Abstract Factory Pattern (抽象工廠模式) 是一種 Creational Design Pattern (創建型設計模式)。它提供一個介面,用於創建一系列相關或相互依賴的物件,而不需要指定其實體類別。這樣可以隔離實體類別的變化,使得程式碼更容易擴展和維護。
簡介
- 模式名稱:
Abstract Factory Pattern
- 問題:
當需要創建一系列相關或相互依賴的物件時,如果直接在程式碼中使用實體類別,會導致程式碼的脆弱性,使得程式碼難以擴展和維護。
- 解決方案:
使用 Abstract Factory Pattern,將實體類別隱藏在介面後面,使用工廠方法來創建物件,讓客戶端程式碼只關注介面,而不是具體實現,從而隔離了具體實現的變化。
- 結果:
使程式碼更容易擴展和維護,提高程式碼的可讀性和可靠性。
在 C# 中實現 Abstract Factory Pattern 的重點如下:
- 創建一個抽象工廠介面 (Abstract Factory Interface),該介面定義了創建一系列相關物件的方法。
public interface IFoodFactory
{
INoodle CreateNoodle();
ISashimi CreateSashimi();
}
- 創建一系列相關的產品介面 (Product Interfaces),每個介面定義了該產品所具有的方法。
public interface INoodle
{
void Cook();
}
public interface ISashimi
{
void Cook();
}
- 創建一系列實體產品類別 (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...");
}
}
- 創建一個工廠實作類別 (Abstract Factory Implementation),該類別實現了抽象工廠介面,並且返回實體的產品類別實例。
public class JapaneseFoodFactory : IFoodFactory
{
public INoodle CreateNoodle()
{
return new Ramen();
}
public ISashimi CreateSashimi()
{
return new Tuna();
}
}
- 在客戶端程式碼中,使用抽象工廠介面來創建產品,而不是直接使用具體類別。
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();
}
}
- 在主程式中,創建具體工廠介面的實例,並將其傳遞給客戶端程式碼中的構造函數。
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 的簡介和實現方式,以及幾種初始化抽象工廠的方式。希望對您有所幫助。