zoukankan      html  css  js  c++  java
  • 设计模式---抽象工厂

    组成

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

  • 相关阅读:
    C++ 面向对象高级开发 -- static
    C++ 面向对象高级开发 -- complex 类的实现
    单独编译PCL的kdtree模块报错“undefined reference to”
    【C++】预处理指令#define,#ifdef,#ifndef,#endif ...
    点云配准(Registration)算法——以PCL为例
    算法岗求职资料汇总
    C++面向对象高级开发
    opencv的常用头文件
    ubuntu下,VSCode采用cmake编译C++工程
    "error while loading shared libraries: xxx.so.x" 错误的原因和解决办法
  • 原文地址:https://www.cnblogs.com/fecktty2013/p/designpatterns-abstractfactory.html
Copyright © 2011-2022 走看看