码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式---抽象工厂

时间:2014-10-29 23:38:44      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   os   ar   使用   sp   on   

组成

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

UML类图

bubuko.com,布布扣

实践

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

类图

bubuko.com,布布扣

代码

抽象产品

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();
        }
    }
}

设计模式---抽象工厂

标签:style   blog   http   io   os   ar   使用   sp   on   

原文地址:http://www.cnblogs.com/fecktty2013/p/designpatterns-abstractfactory.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!