观《大话设计模式》之——简单工厂模式
面向对象有啥好处?为啥要用面向对象来进行软件开发?没看之前,了解的不过,理解也不深刻,看了《大话设计模式》第一章,印象也深刻了,理解也加深了。当我学了面向对象的分析设计编程思想,开始考虑通过封装、继承、多态把程序的耦合度降低。使程序更加的灵活,容易修改,并且易于复用。
那么何谓是简单工厂模式呢,因为在我们日常编程中,经常出现一种情况就是每当“new”一个对象之后,这个对象就依赖于某个类。如果在后期的维护过程中由于某些原因需要修改一下这个类,则唯一的做法就是打开源代码,进行修改,修改所有与这个对象有关的操作。这对我们是非常不利的。问题出来了:对象不能应对“具体实例化类型”的变化。那么简单工厂模式就是出来了,它的意图就是:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类或接口。或者是提供一个类,由它负责根据一定的条件创建某一具体类的实例。
下面就写写我看完《大话设计模式》第一章之后的心得吧!就拿书中的例子来讲:请实现一个简单的计算器控制台的程序。
1、业务的封装
运算类:
1 /// <summary> 2 /// 运算操作类 3 /// </summary> 4 public class Operation 5 { 6 private double _numberA = 0; 7 private double _numberB = 0; 8 9 /// <summary> 10 /// 输入值A 11 /// </summary> 12 public double NumberA 13 { 14 get { return _numberA; } 15 set { _numberA = value; } 16 } 17 18 /// <summary> 19 /// 输入值B 20 /// </summary> 21 public double NumberB 22 { 23 get { return _numberB; } 24 set { _numberB = value; } 25 } 26 27 /// <summary> 28 /// 运算的虚方法 29 /// </summary> 30 /// <returns></returns> 31 public virtual double GetResult() 32 { 33 return 0; 34 } 35 }
加减乘除类,继承与运算类
1 /// <summary> 2 /// 加法类 3 /// </summary> 4 public class OperationAdd : Operation 5 { 6 public override double GetResult() 7 { 8 double result = 0; 9 result = NumberA + NumberB; 10 return result; 11 } 12 } 13 14 /// <summary> 15 /// 减法类 16 /// </summary> 17 public class OperationSub : Operation 18 { 19 public override double GetResult() 20 { 21 double result = 0; 22 result = NumberA - NumberB; 23 return result; 24 } 25 } 26 27 /// <summary> 28 /// 乘法类 29 /// </summary> 30 public class OperationMul : Operation 31 { 32 public override double GetResult() 33 { 34 double result = 0; 35 result = NumberA * NumberB; 36 return result; 37 } 38 } 39 40 /// <summary> 41 /// 除法类 42 /// </summary> 43 public class OperationDiv : Operation 44 { 45 public override double GetResult() 46 { 47 double result = 0; 48 if(NumberB==0) 49 throw new Exception("除数不能为0。"); 50 result = NumberA / NumberB; 51 return result; 52 } 53 }
工厂类:
1 /// <summary> 2 /// 运算符的简单工厂类 3 /// </summary> 4 public class SimpleFactory 5 { 6 public static Operation CreateOperate(string operate) 7 { 8 Operation oper = null; 9 switch (operate) 10 { 11 //实例化加法类 12 case "+": 13 oper=new OperationAdd(); 14 break; 15 //实例化减法类 16 case "-": 17 oper = new OperationSub(); 18 break; 19 //实例化乘法类 20 case "*": 21 oper=new OperationMul(); 22 break; 23 //实例化除法类 24 case "/": 25 oper=new OperationDiv(); 26 break; 27 } 28 29 return oper; 30 } 31 }
最后就是客户端调用的方法了:
1 static void Main(string[] args) 2 { 3 double result; 4 Operation operAdd = SimpleFactory.CreateOperate("+"); 5 operAdd.NumberA = 1; 6 operAdd.NumberB = 2; 7 result = operAdd.GetResult(); 8 Console.WriteLine("加法运算的结果值为:{0}", result); 9 Operation operSub = SimpleFactory.CreateOperate("-"); 10 operSub.NumberA = 4; 11 operSub.NumberB = 2; 12 result = operSub.GetResult(); 13 Console.WriteLine("减法运算的结果值为:{0}", result); 14 Console.ReadKey(); 15 }
2.运算结果
3.简单工厂的优势和劣势
优势:
- 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对 象的尴尬局面中摆脱出来。
- 外界与具体类隔离开来,偶合性低。
- 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
劣势:
- 工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则
- 虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。
应用情况:
- 工厂类负责创建的对象比较少
- 客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心
最后限于本人水平有限,有不足之处请多多拍砖!
参考引用:
1.程杰著作的 《大话设计模式》
2.博客园里的某篇文章—《.NET设计模式(1): 简单工厂模式》