zoukankan      html  css  js  c++  java
  • 简单工厂模式(Simple Factory) 创建型模式

          从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

    意图

      专门定义一个工厂类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。工厂类负责根据一定的条件创建某一具体类的实例,客户端不参与创建具体产品,仅通过传入参数选择需要“消费”对象。而不必管这些对象究竟如何创建及如何组织的,从而使得客户端和实现之间的解耦。

     

     

    实质

      是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。

     

     

    使用场景

    • 工厂类负责创建的对象是已知的情况,否者就会违反开闭原则。
    • 客户只知道传入了工厂类的参数,对如何创建对象(逻辑)不关心 。

     

     

    参与者:
    •工厂角色(Creator)
        是简单工厂模式的核心,它负责实现创建所有具体产品类的实例。工厂类可以被外界直接调用,创建所需的产品对象。   
    •抽象产品角色(Product)
        是所有具体产品角色的父类,它负责描述所有实例所共有的公共接口。   
    •具体产品角色(Concrete Product)
        继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标。工厂类返回的都是该角色的某一具体产品。

     

    UML图:

     

    View Code
    public interface IProduct
    
        {
    
            void Action();
    
        }
    
     
    
        public class ConcreteProduct1 : IProduct
    
        {
    
     
    
            public void Action()
    
            {
    
                //
    
            }
    
        }
    
     
    
        public class ConcreteProduct2 : IProduct
    
        {
    
     
    
            public void Action()
    
            {
    
                //
    
            }
    
        }
    
        public class SimpleFactory
    
        {
    
            public static IProduct CreateProduct(string productName)
    
            {
    
                IProduct product = null;
    
                switch (productName.Trim().ToLower())
    
                {
    
                    case "concreteproduct1":
    
                        product = new ConcreteProduct1();
    
                        break;
    
                    case "concreteproduct2":
    
                        product = new ConcreteProduct2();
    
                        break;
    
                    default:
    
                        throw new Exception("没有生产相应的产品");
    
                }
    
                return product;
    
            }
    
        }

    优点

    • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
    • 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对象的尴尬局面中摆脱出来。外界与具体类隔离开来,偶合性低。
    • 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

    缺点

    • 当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响,违反了高内聚责任分配原则。
    • 所能创建的类只能是事先教考虑到的,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP).
    • 简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

     

    总结:以上纯属个人的理解,对于有些地方觉得还是理解不是很深,有不足之处和错误的地方希望大家帮我指出。谢谢

  • 相关阅读:
    编写代码实现图片懒加载
    原型链
    算法问题:获取字符串中,不重复的且最长字符串的长度
    ES6 的 Set 方法
    Vue 的生命周期
    关于 Web 前端的各种优化
    JS 排序算法,冒泡排序,插入排序,选择排序,归并排序,sort排序
    web 的 XSS 和 CSRF 攻击
    TCP 的三次握手和四次挥手
    理解 四种清除浮动的方法
  • 原文地址:https://www.cnblogs.com/gyb333/p/SimpleFactory.html
Copyright © 2011-2022 走看看