设计模式设计模式重温设计模式 --- 抽象工厂模式
Fantasy-ke引言
抽象工厂模式一种创建型设计模式,它提供了一种方式来封装一组具有相同主题的工厂,而不必指定它们具体的类。这样,客户端代码就可以使用抽象工厂来创建一组相关的对象,而不必关心实际创建的具体类。
抽象工厂模式有以下几个主要角色:
抽象工厂(AbstractFactory):声明用于创建抽象产品的操作的接口。
工厂实现(ConcreteFactory):实现创建具体产品对象的操作。
抽象产品(AbstractProduct):声明产品对象类型的接口。
产品实现(Product):定义由相应的具体工厂创建的产品对象,实现AbstractProduct接口。
下面使用C#实现抽象工厂模式:
抽象工厂
定义一个抽象工厂接口,其中包含了创建不同产品的方法:
1 2 3 4 5
| public interface IAbstractFactory { IProductA CreateProductA(); IProductB CreateProductB(); }
|
工厂实现
定义具体的工厂类,实现抽象工厂接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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接口,并且分别提供了不同的产品实现。
抽象产品
1 2 3 4
| public interface IProductA { string GetName(); }
|
产品实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| 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"; } }
|
下面,我们可以使用抽象工厂来创建一组相关的对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 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(); }
|
输出: