代码改变世界

设计模式---抽象工厂

2014-10-29 21:34  周信达  阅读(219)  评论(0编辑  收藏  举报

组成

  • 抽象层
    • 抽象工厂,负责创建抽象族类产品
    • 抽象产品,负责提供抽象族类产品定义
  • 实现层
    • 具体对象,负责实现族类具体产品
    • 具体产品,负责实现族类具体产品
  • 应用层
    • 使用配置或IOC容器配置具体工厂
    • 针对抽象接口编码创建具体产品

UML类图

Abstract factory UML.svg

实践

  • 一般抽象层可以通过接口或抽象类进行定义,具体选择接口或抽象类,可以根据实际情况考量
  • 抽象层一般定义在单独的基础程序集中,定义核心程序集FactoryCore.dll
  • 实现层一般定义在扩展的程序集中,依赖抽象层,定义扩展程序集FactoryCore.Extension.dll
  • 应用层针对抽象接口编程,具体如何选择实现层,可以通过配置或者DI容器进行管理

类图

classd1

代码

抽象产品

namespace AbstractFactory.AbstractProduct
{
    /// <summary>
    /// 族类A产品抽象
    /// </summary>
    public abstract class AbstractProductA
    {
        public abstract string Name { get; }
        public abstract void Action();
    }
}

抽象工厂

namespace AbstractFactory.AbstractFactory
{
    /// <summary>
    /// 抽象工厂类
    /// 提供抽象接口,用于创建抽象族类产品
    /// </summary>
    public abstract class ProductFactory
    {
        public abstract AbstractProductA CreateProductA();
        public abstract AbstractProductB CreateProductB();
    }
}

具体产品

namespace AbstractFactory.ConcreteObject
{
    class ProductA1 : AbstractProductA
    {
        public override string Name
        {
            get { return "ProductA1"; }
        }

        public override void Action()
        {
            Console.WriteLine("Action as Product A1");
        }
    }
}

具体工厂

namespace AbstractFactory.ConcreteFactory
{
    class Factory1 : ProductFactory
    {
        public override AbstractProductA CreateProductA()
        {
            return new ProductA1();
        }

        public override AbstractProductB CreateProductB()
        {
            return new ProductB1();
        }
    }
}

应用层

namespace AbstractFactory
{
    class Consumer
    {
        public Consumer(ProductFactory factory)
        {
            ProductFactory = factory;
            ProductA = ProductFactory.CreateProductA();
            ProductB = ProductFactory.CreateProductB();
        }

        public ProductFactory ProductFactory { get; set; }

        public AbstractProductA ProductA { get; set; }

        public AbstractProductB ProductB { get; set; }

        public void DoSomething()
        {
            ProductA.Action();
            ProductB.Action();
        }
    }
}

后续

关于简单工厂和工厂方法,由于思想差异不是很大,在这里就不一一介绍了,具体可以参考:

设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

更多的,请参考互联网:Differences between Abstract Factory Pattern and Factory Method