前文中介绍了简单工厂模式和工厂方法模式,本文介绍工厂模式中的最后一种:抽象工厂模式。
应用场景:假设现在要模拟汽车生产这样一个过程,我们知道汽车生产包括:车门的生成、轮子的生产等等;
不同的汽车厂商生成的车门、轮子是不相同的,但所有的汽车都是由轮子、车门这些部件组成的,汽车的构成
是不变的,并且轮子、车门是构成汽车的一系列的对象,我们把构成一个事物的一系列抽象对象,封装成一个
抽象工厂,具体的事物(如宝马车)继承自这个抽象工厂,然后实现相关的接口即可。
代码:
namespace ConsoleTest.test
{
public class AbstractFactoryTest
{
private CarFactory cf;
public void Test()
{
cf = new BMWFactory(); //
cf.CreateDoor();
cf.CreateWheel();
Console.ReadLine();
}
}
/// <summary>
/// 表示汽车的抽象工厂。
/// </summary>
abstract class CarFactory
{
public abstract IWheel CreateWheel();
public abstract IDoor CreateDoor();
}
/// <summary>
/// 轮子接口。
/// </summary>
interface IWheel
{
IWheel Create();
}
/// <summary>
/// 车门接口。
/// </summary>
interface IDoor
{
IDoor Create();
}
/// <summary>
/// 生产宝马车的工厂。
/// </summary>
class BMWFactory : CarFactory
{
/// <summary>
/// 生成轮子。
/// </summary>
/// <returns></returns>
override public IWheel CreateWheel()
{
return new BMWWheel().Create();
}
/// <summary>
/// 生成车门。
/// </summary>
/// <returns></returns>
override public IDoor CreateDoor()
{
return new BMWDoor().Create();
}
}
/// <summary>
/// 宝马轮子。
/// </summary>
class BMWWheel : IWheel
{
public IWheel Create()
{
Console.WriteLine("生成宝马轮子...");
return this;
}
}
/// <summary>
/// 宝马车门。
/// </summary>
class BMWDoor : IDoor
{
public IDoor Create()
{
Console.WriteLine("生成宝马车门...");
return this;
}
}
}
从代码可以看出,在具体的客户类AbstractFactoryTest中只需要保存抽象工厂类CarFactory就可以了,在使用时动态实例化为需要的工厂(BMWFactory),这样就将客户类与具体的对象解耦了。