引入:
我们在编程的时候,每当"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的高内聚的责任分配原则
- 虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。(这个问题在下一个工厂方法模式将得到很好的解决)
应用情景:
- 工厂类负责创建的对象比较少
- 客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心
来源:https://www.cnblogs.com/xiaoxiaomi/p/5824504.html