观《大话设计模式》之——简单工厂模式

  面向对象有啥好处?为啥要用面向对象来进行软件开发?没看之前,了解的不过,理解也不深刻,看了《大话设计模式》第一章,印象也深刻了,理解也加深了。当我学了面向对象的分析设计编程思想,开始考虑通过封装、继承、多态把程序的耦合度降低。使程序更加的灵活,容易修改,并且易于复用。

  那么何谓是简单工厂模式呢,因为在我们日常编程中,经常出现一种情况就是每当“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): 简单工厂模式》

posted @ 2012-06-09 22:18  cryAllen  阅读(459)  评论(0编辑  收藏  举报