简单工厂模式-Simple Factory Pattern

僤鯓⒐⒋嵵緔 提交于 2020-01-26 05:14:43

引入:
我们在编程的时候,每当"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的高内聚的责任分配原则
  • 虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。(这个问题在下一个工厂方法模式将得到很好的解决)

应用情景:

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

源码下载

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!