zoukankan      html  css  js  c++  java
  • 设计模式之 简单工厂,工厂方法,抽象工厂

    学习来源: C#设计模式,刘伟

    创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展.

    引言: 

    简单工厂(静态工厂)

    1, 模式适用环境

    工厂类负责创建的对象比较少,由于创建的对象较少 ,不会造成工厂方法中的业务逻辑太过复杂

    客户端只知道传入工厂类的参数,对于如何创建对象 并不关心

    2, 简单工厂(静态工厂)方法的缺点:

    工厂类集中了所有产品的创建逻辑,职责过重,一旦 不能正常工作,整个系统都要受到影响

    增加系统中类的个数(引入了新的工厂类),增加了 系统的复杂度和理解难度

    系统扩展困难,一旦添加新产品不得不修改工厂逻辑

    由于使用了静态工厂方法,造成工厂角色无法形成基 于继承的等级结构,工厂类不能得到很好地扩展

    3, 简单工厂方法的优点

    实现了对象创建和使用的分离.  ==> 类的创建和使用分离,确保单一职责.

    客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可

    通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性 .

    工厂方法设计模式.

    ca435902-462d-4373-bf5e-6b6ae2b12456[11]

        针对简单工厂, 增加工厂方法接口.

        更进一步, 可以讲抽象工厂接口变更为抽象类.

    /将接口改为抽象类
    abstract class LoggerFactory 
    {
        //在工厂类中直接调用日志记录器类的业务方法WriteLog()
        public void WriteLog() 
        {
            Logger logger = this.CreateLogger();
            logger.WriteLog(); //已经将具体工厂延迟到子类.
        }
        
        public abstract Logger CreateLogger();    
    }
    using System;
    using System.Configuration;
    using System.Reflection;
    namespace FactoryMethodSample
    {
        class Program
        {
            static void Main(string[] args)
            {
                LoggerFactory factory; //针对抽象工厂类编程
                Logger logger; //针对抽象产品类编程
                //读取配置文件
                string factoryString = ConfigurationManager.AppSettings["factory"];
                //反射生成对象
                factory = (LoggerFactory)Assembly.Load("FactoryMethodSample").CreateInstance(factoryString);
                logger = factory.CreateLogger();
                logger.WriteLog();
                Console.Read();
            }
        }
    }
    ==> 更进一步之后的,省略了创建过程.
    using System;
    using System.Configuration;
    using System.Reflection;
    namespace FactoryMethodSample
    {
        class Program
        {
            static void Main(string[] args)
            {
                LoggerFactory factory; //针对抽象工厂类编程
                //读取配置文件
                string factoryString = ConfigurationManager.AppSettings["factory"];
                //反射生成对象
                factory = (LoggerFactory)Assembly.Load("FactoryMethodSample").CreateInstance(factoryString);
                factory.WriteLog(); //直接使用工厂对象来调用产品对象的业务方法
                Console.Read();
            }
        }
    }

      第三部分. 抽象工厂.

       对工厂方法的增强, 例如原本就一个产品. 现在是一组产品. 例如不同风格皮肤, 包括不同风格按钮.

       

      //使用抽象层定义
      SkinFactory factory;
      Button bt;
      TextField tf;
      ComboBox cb;
      
      //读取配置文件
      string factoryType = ConfigurationManager.AppSettings["factory"];
      
      //反射生成对象
      factory = (SkinFactory)Assembly.Load("AbstractFactorySample").CreateInstance(factoryType);
      
      bt = factory.CreateButton();
      tf = factory.CreateTextField();
      cb = factory.CreateComboBox();
      bt.Display();
      tf.Display();
      cb.Display();
      
       Console.Read();

    f162e031-1532-4995-8928-489834e759ce[12]

    2种产品线, 2个具体工厂. 2*3个具体产品. 3个抽象产品. 

  • 相关阅读:
    Flex Box 简单弹性布局
    CSS 0.5px 细线边框的原理和实现方式
    前端模块化方案全解(CommonJS/AMD/CMD/ES6)
    用信鸽来讲解HTTPS的知识
    __name__ == "__main__"的作用是什么?
    如何自学计算机科学与技术(Teach Yourself Computer Science)
    中文技术文档的写作规范
    'adb remount'的作用是什么?在什么情况下有用?
    使用python遍历文件夹取出特定的字符串
    Python&Appium实现安卓手机图形解锁
  • 原文地址:https://www.cnblogs.com/hijushen/p/4564125.html
Copyright © 2011-2022 走看看