Head First设计模式之抽象工厂模式

一、定义

给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:
     1)系统中有多个产品族,而系统一次只可能消费其中一族产品。 
     2)同属于同一个产品族的产品以其使用。 

二、结构

Head First设计模式之抽象工厂模式

抽象工厂模式的各个角色(和工厂方法一样): 
     1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 
     2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
     3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。
     4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

三、实现

namespace DesignPatterns.AbstractFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            IAbstractFactory factory = null;

            factory = new XiaomiFactory();
            factory.ProductMobile();
            factory.ProductMp3();

            factory = new HuaweiFactory();
            factory.ProductMobile();
            factory.ProductMp3();
        }
    }

    public abstract class AbstractProduct
    {

    }

    public abstract class Mobile : AbstractProduct
    {

    }
    public class XiaomiMobile : Mobile
    {

    }
    public class HuaweiMobile : Mobile
    {

    }
    public abstract class Mp3 : AbstractProduct
    {
    }
    public class XiaomiMp3 : Mp3
    {
    }
    public class HuaweiMp3 : Mp3
    {
    }

    public interface IAbstractFactory
    {
        Mobile ProductMobile();
        Mp3 ProductMp3();
    }

    public class XiaomiFactory : IAbstractFactory
    {
        public Mobile ProductMobile()
        {
            Console.WriteLine("生产小米手机.");
            return new XiaomiMobile();
        }

        public Mp3 ProductMp3()
        {
            Console.WriteLine("生产小米MP3.");
            return new XiaomiMp3();
        }
    }

    public class HuaweiFactory : IAbstractFactory
    {
        public Mobile ProductMobile()
        {
            Console.WriteLine("生产华为手机.");
            return new HuaweiMobile();
        }

        public Mp3 ProductMp3()
        {
            Console.WriteLine("生产华为MP3.");
            return new HuaweiMp3();
        }
    }
}

四、适用场景

  1、QQ 换皮肤,一整套一起换。

  2、生成不同操作系统的程序。

五、优缺点

优点:

抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点:

增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

欢迎阅读本系列文章:Head First设计模式之目录