设计模式之简单工厂

面向对象编程特点:可维护,可复用,可扩展,灵活性高。 通过封装,继承,多态把程序耦合度降低,用设计模式使得程序更加灵活,容易修改,易于复用。 

案例:实现计算器控制台程序:

第一次做法:直接MAIN函数里面洋洋洒洒写下来所有代码。

缺点:无复用性

第二次做法:考虑业务的复用性,封装一个运算类(方法)通过形参把要操作的数字和符号输入,得到结果。只要调去这个运算方法,计算器,PDA多种设备都可以实现计算功能

缺点:如果增加一个开平方运算,则需要修改这个核心方法,有可能被修改人增加别的后门程序,或者修改之前确定了的方法。

第三次做法:设定一个父类,里面设置要进行操作的两个数组作为属性,设置得到运算结果的虚方法GetResult(),再分别写出加减乘除的子类继承父类,每个子类实现自己的GetResult()方法。这样当增加开平方运算的时候,只需要新建立一个子类,继续继承父类,实现虚方法即可,不影响其他的方法。

 1 public class Operator
 2     {
 3         public double NumberA { get; set; }
 4         public double NumberB { get; set; }
 5         public virtual double GetResult() 
 6         {
 7             double result = 0;
 8             return result;
 9         }
10     }
11 
12     class OperatorAdd :Operator
13     {
14         public override double GetResult()
15         {
16             return NumberA + NumberB;
17         }
18     }
19 
20     class OperatorSub : Operator
21     {
22         public override double GetResult()
23         {
24             return NumberA - NumberB;
25         }
26     }
展示代码

优点案例:比如有个公司薪资管理系统,分技术月薪,销售月薪,经理月薪。现在增加一个兼职人员月薪需要写入,完全不影响前三种情况,直接加一个子类继承父类即可。

缺点:如何让计算器知道要做的是加是减还是乘除?

最终做法:再建立一个工厂方法,在工厂方法里用多态根据符号判断该用哪个子类,直接实例化出合适对象,通过多态返回父类的方法实现结果。

 1  public class OperatorFactory
 2     {
 3         public static Operator CreateOperator(string sign)
 4         {
 5             Operator opter = null;
 6             switch(sign)
 7             {
 8                 case "+" :
 9                     opter = new OperatorAdd();
10                     break;
11                 case "-":
12                     opter = new OperatorSub();
13                     break;
14             }
15             return opter;
16         }
17     }
展示代码

客户端代码只需要很简单的输入内容即可:

 1  static void Main(string[] args)
 2         {
 3             Operator oper;
 4             oper = OperatorFactory.CreateOperator("+");
 5             oper.NumberA = 1;
 6             oper.NumberB = 2;
 7             var temp = oper.GetResult();
 8             Console.Write(temp);
 9             Console.ReadLine();
10         }
View Code

至此,如果加法方法变更,只需要修改加法的子类,如果需要增加开平方,则增加一个开平方类继承父类,同时在工厂里面加上相应的CASE对应。

 

posted on 2013-07-31 16:34  冲刺  阅读(169)  评论(0)    收藏  举报

导航