• 简单工厂模式-Simple Factory Pattern


    引入:
    我们在编程的时候,每当"new"一个对象之后,这个对象就依赖于这个类了。如果在后期的维护过程中由于某些原因需要修改一下这个类,则唯一的做法就是打开源代码,进行修改,修改所有与这个对象有关的操作。这对我们是非常不利的。
    问题出来了:对象不能应对“具体实例化类型”的变化
    解决思路:封装变化点,哪里变化,封装哪里。在这个例子中,要实例化的类变了,就将实例化这个操作封装起来,我们可以把"new"这个操作移交一个具体的类,由它去负责根据我们的条件创建具体类的实例,也就是下面要说的“简单工厂模式”。


    定义:
    专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。简单工厂模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常根据一个条件(参数)来返回不同的类的实例。

    意图:
    提供一个类,由它负责根据一定的条件创建某一具体类的实例

    参与者:

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

     UML图:

    例子:

    抽象产品类代码

    1     /// <summary>
    2     /// 苹果抽象类
    3     /// </summary>
    4     public abstract class IPhone
    5     {
    6         public abstract void Print();
    7     }

    具体产品类代码

     1     /// <summary>
     2     /// 苹果6s
     3     /// </summary>
     4     public class IPhone6s : IPhone
     5     {
     6         //重写IPhone中的Print()方法
     7         public override void Print()
     8         {
     9             Console.WriteLine("生产出来的是IPhone6s型号");
    10         }
    11     }
     1     /// <summary>
     2     /// 苹果7s
     3     /// </summary>
     4     public class IPhone7s : IPhone
     5     {
     6         //重写IPhone中的Print()方法
     7         public override void Print()
     8         {
     9             Console.WriteLine("生产出IPhone7s(等待预售中。。。。。。)");
    10         }
    11     }

    简单工厂模式中最核心的部分:工厂类

     1     /// <summary>
     2     /// 简单工厂类  负责  产出苹果手机
     3     /// </summary>
     4     public class IPhoneSimpleFactory
     5     {
     6         public static IPhone CreateIPhone(string type)
     7         {
     8             IPhone iphone = null;
     9             if (type.Equals("IPhone6s"))
    10             {
    11                 //创建实例
    12                 iphone = new IPhone6s();
    13             }
    14             else if (type.Equals("IPhone7s"))
    15             {
    16                 iphone = new IPhone7s();
    17             }
    18             return iphone;
    19         }
    20     }

    再看一下客户在调用的时候的代码

     1  static void Main(string[] args)
     2         {
     3             IPhone iphone6 = IPhoneSimpleFactory.CreateIPhone("IPhone6s");//把要的手机型号输入,然后去工厂里面去生产制造
     4             iphone6.Print();
     5 
     6             IPhone iphone7 = IPhoneSimpleFactory.CreateIPhone("IPhone7s");
     7             iphone7.Print();
     8 
     9             Console.ReadKey();
    10         }

    优点:

    • 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对 象的尴尬局面中摆脱出来。
    • 外界与具体类隔离开来,偶合性低。
    • 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

    缺点:

    • 工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则
    • 虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。(这个问题在下一个工厂方法模式将得到很好的解决)

    应用情景:

    • 工厂类负责创建的对象比较少
    • 客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心

    源码下载

  • 相关阅读:
    从原理层面掌握@InitBinder的使用【享学Spring MVC】
    array详解
    forward_list详解
    list详解
    deque详解
    vector详讲(三)实例
    vector详讲(二)迭代器
    vector详讲(一)
    numeric_limits<>函数
    seek()和tell()在文件里转移
  • 原文地址:https://www.cnblogs.com/xiaoxiaomi/p/5824504.html
Copyright © 2020-2023  润新知