定义
提供一个创建一系列相关或相互依赖的对象的接口,而无需指定具体的类。
使用频率:
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类及其所有子类的改变。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦