首页 > 代码库 > 设计模式---抽象工厂

设计模式---抽象工厂

组成

  • 抽象层
    • 抽象工厂,负责创建抽象族类产品
    • 抽象产品,负责提供抽象族类产品定义
  • 实现层
    • 具体对象,负责实现族类具体产品
    • 具体产品,负责实现族类具体产品
  • 应用层
    • 使用配置或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();        }    }}

设计模式---抽象工厂