## 引言 **抽象工廠模式**一種創建型設計模式,它提供了一種方式來封裝一組具有相同主題的工廠,而不必指定它們具體的類。這樣,客戶端代碼就可以使用抽象工廠來創建一組相關的對象,而不必關心實際創建的具體類。 抽象工廠模式有以下幾個主要角色: - 抽象工廠(AbstractFactory):聲明用於創 ...
引言
抽象工廠模式一種創建型設計模式,它提供了一種方式來封裝一組具有相同主題的工廠,而不必指定它們具體的類。這樣,客戶端代碼就可以使用抽象工廠來創建一組相關的對象,而不必關心實際創建的具體類。
抽象工廠模式有以下幾個主要角色:
-
抽象工廠(AbstractFactory):聲明用於創建抽象產品的操作的介面。
-
工廠實現(ConcreteFactory):實現創建具體產品對象的操作。
-
抽象產品(AbstractProduct):聲明產品對象類型的介面。
-
產品實現(Product):定義由相應的具體工廠創建的產品對象,實現AbstractProduct介面。
下麵使用C#實現抽象工廠模式:
抽象工廠
定義一個抽象工廠介面,其中包含了創建不同產品的方法:
public interface IAbstractFactory
{
IProductA CreateProductA();
IProductB CreateProductB();
}
工廠實現
定義具體的工廠類,實現抽象工廠介面:
public class ConcreteFactory1 : IAbstractFactory
{
public IProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 : IAbstractFactory
{
public IProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
在上述示例中,我們定義了兩個具體工廠類:ConcreteFactory1
和ConcreteFactory2
。這兩個工廠類都實現了IAbstractFactory
介面,並且分別提供了不同的產品實現。
抽象產品
public interface IProductA
{
string GetName();
}
產品實現
public class ConcreteProductA1 : IProductA
{
public string GetName()
{
return "ProductA1";
}
}
public class ConcreteProductA2 : IProductA
{
public string GetName()
{
return "ProductA2";
}
}
public interface IProductB
{
string GetName();
}
public class ConcreteProductB1 : IProductB
{
public string GetName()
{
return "ProductB1";
}
}
public class ConcreteProductB2 : IProductB
{
public string GetName()
{
return "ProductB2";
}
}
下麵,我們可以使用抽象工廠來創建一組相關的對象:
public class Client
{
private IAbstractFactory factory;
public Client(IAbstractFactory factory)
{
this.factory = factory;
}
public void Run()
{
var productA = factory.CreateProductA();
var productB = factory.CreateProductB();
Console.WriteLine(productA.GetName());
Console.WriteLine(productB.GetName());
}
}
static void Main(string[] args)
{
var client1 = new Client(new ConcreteFactory1());
client1.Run();
var client2 = new Client(new ConcreteFactory2());
client2.Run();
}
輸出:
ProductA1
ProductB1
ProductA2
ProductB2
總結
上面的示例中,我們使用抽象工廠模式來創建了一組相關的對象,但是需要註意的是,它適用於創建一組相關的產品對象,但是當產品族的變化引起整個工廠等級結構的變化時,抽象工廠模式就不適用了。
此外,抽象工廠模式還存在一些缺點,例如:
-
新增產品會導致工廠介面的擴展。如果需要新增產品,就需要修改所有的工廠類,這會帶來一些不必要的麻煩。
-
可能會導致類層次結構的複雜度增加。如果有多個產品族,就需要定義多個工廠介面,這會增加類層次結構的複雜度。
因此,在使用抽象工廠模式時,需要根據具體情況進行權衡和選擇。
作者: Peter.Pan
出處: https://www.cnblogs.com/pandefu/>
關於作者:.Net Framework,.Net Core ,WindowsForm,WPF ,控制項庫,多線程
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接,否則保留追究法律責任的權利。 如有問題, 可郵件咨詢。