设计模式成长记(一) 抽象工厂模式(Abstract Factory)
目录
定义
提供一个创建一系列相关或相互依赖的对象的接口,而无需指定具体的类。
使用频率:
UML类图
参与者
AbstractFactory:声明一个创建抽象产品的的接口。
ConcreteFactory:实现接口创建具体的产品对象。
AbstractProduct:产品的抽象。
Product:具体的产品,实现抽象产品的接口。
Client:使用抽象工厂和抽象产品。
编写代码
1.新建控制台程序AbstractFactory,新增Abstract.cs类文件
using System; /// <summary> /// 抽象工程模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定具体的类。 /// </summary> namespace AbstractFactory { /// <summary> /// 抽象产品A /// </summary> public abstract class AbstractProductA { public abstract void SayHello(); } /// <summary> /// 抽象产品B /// </summary> public abstract class AbstractProductB { public abstract void SayHello(); } /// <summary> /// 具体产品A1 /// </summary> public class ProductA1 : AbstractProductA { public override void SayHello() { Console.WriteLine("Hello,我是具体产品A1"); } } /// <summary> /// 具体产品A2 /// </summary> public class ProductA2 : AbstractProductA { public override void SayHello() { Console.WriteLine("Hello,我是具体产品A2"); } } /// <summary> /// 具体产品B1 /// </summary> public class ProductB1 : AbstractProductB { public override void SayHello() { Console.WriteLine("Hello,我是具体产品B1"); } } /// <summary> /// 具体产品B2 /// </summary> public class ProductB2 : AbstractProductB { public override void SayHello() { Console.WriteLine("Hello,我是具体产品B2"); } } /// <summary> /// 抽象工厂:提供创建抽象产品的接口 /// </summary> public abstract class AbstractFactory { public abstract AbstractProductA CreateProductA(); public abstract AbstractProductB CreateProductB(); } /// <summary> /// 具体工厂:实现抽象工厂创建产品的接口 /// </summary> public class ConcreteFactory1 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA1(); } public override AbstractProductB CreateProductB() { return new ProductB1(); } } public class ConcreteFactory2 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA2(); } public override AbstractProductB CreateProductB() { return new ProductB2(); } } public class Client { private AbstractProductA _productA; private AbstractProductB _productB; public Client(AbstractFactory factory) { _productA = factory.CreateProductA(); _productB = factory.CreateProductB(); } public void Run() { _productA.SayHello(); _productB.SayHello(); } } }
2.编写Program.cs
using System; namespace AbstractFactory { class Program { static void Main(string[] args) { //使用工厂1 AbstractFactory factory = new ConcreteFactory1(); Client client = new Client(factory);//依赖注入 client.Run(); Console.WriteLine(); //使用工厂2 factory = new ConcreteFactory2(); client = new Client(factory); client.Run(); Console.Read(); } } }
3.输出结果
特点
1) 分离了具体的类
Abstract Factory 模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。
2) 使得易于交换产品系列
一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。
3) 有利于产品的一致性
当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。
4) 难以支持新种类的产品
难以扩展抽象工厂以生产新种类的产品,这是因为AbstractFactory接口确定了可以被创建的产品集合。 支持新种类的产品就需要扩展该工厂接口,这将涉及 AbstractFactory类及其所有子类的改变。
我叫刘皓,很高兴您能阅读完我的这篇文章。
我花了大量时间和精力来完成这篇文章,如果文章对您有帮助,请不要忘了点推荐哦!
如果您能点击右边的打赏按钮,打赏一杯咖啡钱,我将获得更多的动力和能量写出下一篇好文章。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan
我花了大量时间和精力来完成这篇文章,如果文章对您有帮助,请不要忘了点推荐哦!
如果您能点击右边的打赏按钮,打赏一杯咖啡钱,我将获得更多的动力和能量写出下一篇好文章。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan