为一个产品族提供统一的创建接口。当需要这个产品族的某一系列的时候,可从抽象工厂里选择相应的系列来创建一个具体的工厂。
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。《设计模式》
·抽象工厂(Abstract Factory)
用于声明生成一系列抽象产品的方法。即AbstractFactory,其中带有生成产品A和产品B的创建方法。
·具体工厂(Concrete Factory)
用于执行生成一系列抽象产品的方法,生成一系列具体的产品。这里包括ConcreteProduct_1与ConcreteProduct_2,其中每个实现工厂都带有两种产品的创建方法,不同的是:工厂1生产(创建)1系产品;工厂2生产(创建)2系产品。
·抽象产品(Abstract Product)
用于为这一系列的某一种产品提供接口。这里有AbstractProductA和AbstractProductB。
·具体产品(Concrete Product)
用于定义具体工厂生成的具体产品的对象,实现产品接口。这里有实现AbstractProductA接口的两个系的产品包括:ConcreteProductA_1和ConcreteProductA_2,虽然这是两系的产品,但它们是一种产品!同样,AbstractProductB也包括两系产品。
现在来实现这个模式
(一) 代码
//抽象工厂
//这个工厂可以生产(创建)两种产品A和B
public abstract class AbstractFactory
{
public abstract AbstractProdcutA CreateProductA();
public abstract AbstractProdcutB CreateProductB();
}
//实现工厂1
//用于生产(创建)1系列产品
public class ConcreteFactoryProduct_1:AbstractFactory
{
//因为这是工厂1,所以只负责生产(创建)1系的产品,但产品种类是A和B
//生产A
public override AbstractProdcutA CreateProductA()
{
return new ProductA_1();
}
//生产B
public override AbstractProdcutB CreateProductB()
{
return new ProductB_1();
}
}
//两种产品
//产品A
public abstract class AbstractProdcutA
{
public abstract void ShowDetail();
}
//产品B
public abstract class AbstractProdcutB
{
public abstract void ShowDetail();
}
//1系产品,包括ProductA_1,productB_1
public class ProductA_1 : AbstractProdcutA
{
public override void ShowDetail()
{
Console.WriteLine("1系A产品");
}
}
public class ProductB_1 : AbstractProdcutB
{
public override void ShowDetail()
{
Console.WriteLine("1系B产品");
}
}
(二)测试
[Test]
public void TestAbstractFactory()
{
//得到一个1系产品工厂
AbstractFactory factory = new ConcreteFactoryProduct_1();
//所以只用于生产1系产品,但产品种类有多种,如A,B
//这里添加2种产品
AbstractProdcutA productA = factory.CreateProductA();
AbstractProdcutB productB = factory.CreateProductB();
//看看产品的信息吧
productA.ShowDetail();
productB.ShowDetail();
}
结果:
1系A产品
1系B产品
在软件系统中,经常面临着"一系统相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作。绕过常规的对象创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合。