目录
定义
UML 类图
参与者
编写代码
特点
定义
提供一个创建一系列相关或相互依赖的对象的接口,而无需指定具体的类.
使用频率:
UML 类图
参与者
AbstractFactory:声明一个创建抽象产品的的接口.
ConcreteFactory: 实现接口创建具体的产品对象.
AbstractProduct: 产品的抽象.
Product: 具体的产品,实现抽象产品的接口.
Client: 使用抽象工厂和抽象产品.
编写代码
1. 新建控制台程序 AbstractFactory,新增 Abstract.cs 类文件
2. 编写 Program.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();
}
}
}
3. 输出结果
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();
}
}
}
特点
1) 分离了具体的类
Abstract Factory 模式帮助你控制一个应用创建的对象的类.因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离.客户通过它们的抽象接口操纵实例.产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中.
2) 使得易于交换产品系列
一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候.这使得改变一个应用的具体工厂变得很容易.它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变.
3) 有利于产品的一致性
当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要.而 AbstractFactory 很容易实现这一点.
4) 难以支持新种类的产品
难以扩展抽象工厂以生产新种类的产品,这是因为 AbstractFactory 接口确定了可以被创建的产品集合. 支持新种类的产品就需要扩展该工厂接口,这将涉及 AbstractFactory 类及其所有子类的改变.
来源: https://www.cnblogs.com/liuhaorain/p/3926636.html