简单工厂模式可以说重面向过程转向面向对象的一个比较典型的模式,这是一个基本实现了类的继承和多态的模型,并且最后可进行封装,简单工厂模式并不是很难,但是却很有用。下面是我理解的具体的内容和代码:
1.创建Opretation操作类,这是一个父类,它不具体实现什么,可以说只是一个实体类。
1 /// <summary> 2 /// 这是一个父类,主要作用是获取参数值, 3 /// 定义一个抽象方法,给子类进行重写 4 /// </summary> 5 public class Operation 6 { 7 private double numberA = 0; 8 /// <summary> 9 /// 用于运算的参数A 10 /// </summary> 11 public double NumberA 12 { 13 get { return numberA; } 14 set { numberA = value; } 15 } 16 17 private double numberB = 0; 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 ///进行具体运算符的运算 30 /// </summary> 31 /// <returns>运算结果</returns> 32 public virtual double GetResult() 33 { 34 double result = 0; 35 return result; 36 } 37 }
2.下面是一些具体实现方法的类,他们的作用就是做真正的运算,参数来自于它们的父类:Operation:
1 /// <summary> 2 /// 加法运算实现类 3 /// </summary> 4 public class OperationAdd : Operation 5 { 6 /// <summary> 7 /// 加法运算实现方法 8 /// </summary> 9 /// <returns>运算结果</returns> 10 public override double GetResult() 11 { 12 double result = 0; 13 result = NumberA + NumberB; 14 return result; 15 } 16 } 17 /// <summary> 18 /// 减法运算实现类 19 /// </summary> 20 public class OperationSub : Operation 21 { 22 /// <summary> 23 /// 减法运算实现方法 24 /// </summary> 25 /// <returns>运算结果</returns> 26 public override double GetResult() 27 { 28 double result = 0; 29 result = NumberA + NumberB; 30 return result; 31 } 32 } 33 /// <summary> 34 /// 乘法运算实现类 35 /// </summary> 36 public class OperationMul : Operation 37 { 38 /// <summary> 39 /// 乘法运算实现方法 40 /// </summary> 41 /// <returns>运算结果</returns> 42 public override double GetResult() 43 { 44 double result = 0; 45 result = NumberA * NumberB; 46 return result; 47 } 48 } 49 /// <summary> 50 /// 除法运算实现类 51 /// </summary> 52 public class OperationDiv : Operation 53 { 54 /// <summary> 55 /// 除法运算实现方法 56 /// </summary> 57 /// <returns>运算结果</returns> 58 public override double GetResult() 59 { 60 double result = 0; 61 if (NumberB != 0) 62 { 63 result = NumberA / NumberB; 64 } 65 else 66 { 67 throw new Exception("除数不能为0"); 68 } 69 return result; 70 } 71 }
3.然后就到了简单抽象模式最重要的一个类了,工厂类,它的代码很少,却非常重要,它实现了一个工厂的职责,那就是生产对象:
1 /// <summary> 2 /// 这是一个创建类的工厂,我们需要实现功能的子类通过这里创建 3 /// 这样,降低了耦合性,大大增加了扩展性 4 /// </summary> 5 public class OperationFactory 6 { 7 /// <summary> 8 /// 这是一个创建子类的具体实现方法 9 /// </summary> 10 /// <param name="operate"></param> 11 /// <returns>具体实现功能的子类对象</returns> 12 public static Operation createOperate(string operate) 13 { 14 Operation oper = null; 15 switch (operate) 16 { 17 case "+": 18 oper = new OperationAdd(); 19 break; 20 case "-": 21 oper = new OperationSub(); 22 break; 23 case"*": 24 oper =new OperationMul(); 25 break; 26 case "/": 27 oper = new OperationDiv(); 28 break; 29 default: 30 throw new Exception("运算符不存在"); 31 } 32 return oper; 33 } 34 }
4.最后就是UI层的代码了,功能都有工厂实现了,那么UI层就不需要干多少活啦,它通过工厂类创建了对象,然后调用虚方法来具体实现,等结果就OK啦!
1 class SimpleFactoryDefault 2 { 3 public static void Main() 4 { 5 string operate="+"; 6 Operation oper; 7 oper = OperationFactory.createOperate(operate); 8 oper.NumberA = 1; 9 oper.NumberB = 2; 10 double result = oper.GetResult(); 11 Console.WriteLine("您输入的运算符为:{0},运算结果为:{1}",operate,result.ToString()); 12 Console.ReadKey(); 13 } 14 }
最后,当我们要实现更多的方法的时候,只要创建具体实现的子类,然后修改OperationFactory,增加一个switch分支就可以了,大大降低了代码的耦合性,而且便于日后维护。
简单工厂模式其实正如其名,是很简单的,用处却特别大,目前我觉得它用的最多的地方是大量创建同类对象的地方,然后方便进行管理,同时当我需要修改一个方法的具体实现时,并不会影响其他方法,那么我们就少了很多的测试,减少了我们的工作量。
以上内容部分参考程杰的《大话设计模式》一书