设计模式(创建型模式):抽象工厂

介绍了简单工厂与工厂方法之后,现在我们来看一下工厂三兄弟的最后一个 —— 抽象工厂。
那什么是抽象工厂呢?

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象
的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

说起来,抽象工厂与工厂方法类似,但与工厂不同的是抽象工厂不再提供一个单一的抽象产品创建。而是提供了同一产品族不同产品等级结构的创建方式。
这里解释一下两个名词:

  • 产品等级结构
    在之前的工厂方法当中,一个工厂只能创建一个产品,这个产品可能会有多层继承产品。
    比如说有一个抽象产品电视机,那么可能是苹果手机这一个抽象产品,但是苹果手机有
    多个版本,可能会有 IPHONE5s,IPHONE6,IPHONE7,IPHONE7PLUGS。所以产品结构就
    是一个产品的继承结构,比如我们之前的工厂方法只能生成苹果手机而已。
  • 产品族
    产品族指代的就是由同一个工厂生产的,但是位于不同产品结构中的一组产品。还是
    举个例子,苹果公司不可能生产苹果手机,当然他还有苹果电脑,苹果手表等。所以,一
    个工厂就是一个产品族。

So,在这里说白了我们就是在之前的工厂方法当中进行了一个扩展,使得抽象工厂类不再产生单一的产品结构,而是可以生产多个不同的产品结构,而实现工厂就是不同的产品族。
抽象工厂实现了开闭原则,即要求系统对扩展开放,对修改封闭,通过扩展达到增强其功能的目的。
在这里增加产品族很方便,只需要增加一个工厂即可,对已有的代码无需任何修改。
但是增加产品结构,必须修改抽象工厂类,然后所有实现类都需要更改,不能很好的支持“开闭原则”。
接下来就上代码:

// 电脑产品
public abstract class Computer
{
    public abstract void Run();
}
// 手机产品
public abstract class Phone
{
    public abstract void Run();
}
public class AppleComputer : Computer
{
    public override void Run()
    {
        Console.WriteLine("苹果电脑");
    }
}
public class ApplePhone : Phone
{
    public override void Run()
    {
        Console.WriteLine("苹果手机");
    }
}
public class MicrosoftComputer : Computer
{
    public override void Run()
    {
        Console.WriteLine("微软电脑");
    }
}
public class MicrosoftPhone : Phone
{
    public override void Run()
    {
        Console.WriteLine("微软手机");
    }
}
// 抽象工厂
public abstract class AbsFactory
{
    public abstract Computer BuildComputer();
    public abstract Phone BuildPhone();
}
// 苹果工厂
public class AppleFactory : AbsFactory
{
    public override Computer BuildComputer()
    {
        return new AppleComputer();
    }
    public override Phone BuildPhone()
    {
        return new ApplePhone();
    }
}
// 微软工厂
public class MicrosoftFactory : AbsFactory
{
    public override Computer BuildComputer()
    {
        return new MicrosoftComputer();
    }
    public override Phone BuildPhone()
    {
        return new MicrosoftPhone();
    }
}
public static Program
{
    static Main()
    {
        var microsoftFactory = new MicrosoftFactory();
        Computer microsoftComputer = microsoftFactory.BuildComputer();
        Phone microsoftPhone = micorosoftFactory.BuildPhone();
        var appleFactory = new AppleFactory();
        Computer appleComputer = appleFactory.BuildComputer();
        Phone applePhone = appleFactory.BuildPhone();
        microsoftComputer.Run();
        microsoftPhone.Run();
        appleCompurer.Run();
        applePhone.Run();
    }
}

抽象工厂是工厂方法的进一步扩展,抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。
他们三兄弟之间并没有太大的差别。抽象工厂如果只构建一个产品等级结构的话那么他就退化成为工厂方法,当然工厂方法也可以退化为简单工厂。
抽象工厂模式适用于:

  1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节;
  2. 系统中有多于一个的产品族,而每次只使用其中某一产品族;
  3. 属于同一个产品族的产品将在一起使用;
  4. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。