5.1抽象工厂模式定义:
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
5.2抽象工厂模式UML类图:
5.3应用场景
当我们有一系列的对象而不是单个对象可能变化时,例如:如果我们生产一台笔记本电脑和一台普通的PC机,其所用的原料如显卡、声卡虽然名称都一样,但是很明显,其真实的材料却是肯定不一样的。这时,如果我们由一家生产笔记本电脑的厂商转换成普通PC 机的厂商,那么这意味着具体显卡、声卡、显示屏等一系列对象的变化,这时,我们就可以采用抽象工厂模式。
5.4抽象工厂模式分析与实现(c#描述)
//A产品接口
public interface IProductA
{
void ProductBehavior1();
void ProductBehavior2();
}
//A产品实现类A1
public class ProductA1 : IProductA
{
public void ProductBehavior1()
{
Console.WriteLine("我是A1产品的行为1。");
}
public void ProductBehavior2()
{
Console.WriteLine("我是A1产品的行为2。");
}
}
//A产品实现类A2
public class ProductA2 : IProductA
{
public void ProductBehavior1()
{
Console.WriteLine("我是A2产品的行为1。");
}
public void ProductBehavior2()
{
Console.WriteLine("我是A2产品的行为2。");
}
}
//B产品接口
public interface IProductB
{
void ProductBehavior1();
void ProductBehavior2();
}
//B产品实现类B1
public class ProductB1 : IProductB
{
public void ProductBehavior1()
{
Console.WriteLine("我是B1产品的行为1。");
}
public void ProductBehavior2()
{
Console.WriteLine("我是B1产品的行为2。");
}
}
//B产品实现类B2
public class ProductB2 : IProductB
{
public void ProductBehavior1()
{
Console.WriteLine("我是B2产品的行为1。");
}
public void ProductBehavior2()
{
Console.WriteLine("我是B2产品的行为2。");
}
}
//抽象工厂接口
public interface IAbstractFactory
{
//工厂方法只制造一个产品,则抽象工厂则制造一系列产品,这是两者之间的不同。
//这里实际上就相当于工厂方法的集合。
IProductA CreateProductA();
IProductB CreateProductB();
}
//抽象工厂实现类1
public class AbstractFactory1 : IAbstractFactory
{
//A1和B1是一个系列
public IProductA CreateProductA()
{
return new ProductA1();
}
public IProductB CreateProductB()
{
return new ProductB1();
}
}
//抽象工厂实现类2
public class AbstractFactory2 : IAbstractFactory
{
//A2和B2是一个系列
public IProductA CreateProductA()
{
return new ProductA2();
}
public IProductB CreateProductB()
{
return new ProductB2();
}
}
//调用类
public class AbstractFactory_Test
{
public static void Do()
{
IAbstractFactory lobj_AbstractFactory = new AbstractFactory1();//AbstractFactory1工厂用来创建A1和B1两个对象。
lobj_AbstractFactory.CreateProductA();
lobj_AbstractFactory.CreateProductB();
lobj_AbstractFactory = new AbstractFactory2();//AbstractFactory2工厂用来创建A2和B2两个对象。
lobj_AbstractFactory.CreateProductA();
lobj_AbstractFactory.CreateProductB();
//总结:子类的多个工厂方法封装了产品类的创建过程,即封装了产品的实现。如果增加产品或改变产品时,此处的客户端代码不受影响。
}
}
抽象工厂和工厂方法很类似,都是将具体类的实例化交给子类实现,而客户只依赖于其上层的抽象,即:IAbstractFactory。然而,两者之间的不同是:工厂方法模式解决单个对象可能变化的问题,而抽象工厂则解决一系列对象可能的变化。实际上,抽象工厂完全可以看作是带有N 个工厂方法的集合。