跟皮皮卡读大话设计模式(1)

《大话设计模式》还是一本不错的设计模式书籍。有兴趣的朋友可以和我一起学习。

在读书的过程中一些我认为的重点、学习应该掌握的内容、一些自己的理解和思考,我都会展现出来,和园子里的朋友一起交流、学习。大侠拍砖轻点--

本次主要内容为:简单工厂模式 学习页面为:1-34(page)

书中勾勒、笔记:

 

简单工厂UML图示:

红色标记的地方有2个疑问:

1.这里我用的关联,本来不应该显示0..*、0..1类似这样的文字 ,为何这里显示?

2.备注应该用虚线表示,为何我的powerdisiger 12.5没有虚线? 有知道的朋友告诉下~~

 

代码如下:

View Code
  1 /// <summary>
  2     /// 运算类
  3     /// </summary>
  4     class Operation
  5     {
  6         private double _numberA;
  7         private double _numberB;
  8 
  9         /// <summary>
 10         /// 数字A
 11         /// </summary>
 12         public double NumberA
 13         {
 14             get
 15             {
 16                 return _numberA;
 17             }
 18             set
 19             {
 20                 _numberA = value;
 21             }
 22         }
 23 
 24         /// <summary>
 25         /// 数字B
 26         /// </summary>
 27         public double NumberB
 28         {
 29             get
 30             {
 31                 return _numberB;
 32             }
 33             set
 34             {
 35                 _numberB = value;
 36             }
 37         }
 38 
 39         /// <summary>
 40         /// 得到结果
 41         /// </summary>
 42         /// <returns></returns>
 43         public virtual double GetResult()
 44         {
 45             double reuslt = 0;
 46             return reuslt;
 47         }
 48     }
 49 
 50     /// <summary>
 51     /// 加法类
 52     /// </summary>
 53     class OperationAdd : Operation
 54     {
 55         public override double GetResult()
 56         {
 57             double result = 0;
 58             result = NumberA + NumberB;
 59             return result;
 60         }
 61     }
 62 
 63     /// <summary>
 64     /// 减法类
 65     /// </summary>
 66     class OperationSub : Operation
 67     {
 68         public override double GetResult()
 69         {
 70             double result = 0;
 71             result = NumberA - NumberB;
 72             return result;
 73         }
 74     }
 75 
 76     /// <summary>
 77     /// 乘法类
 78     /// </summary>
 79     class OperationMul : Operation
 80     {
 81         public override double GetResult()
 82         {
 83             double result = 0;
 84             result = NumberA * NumberB;
 85             return result;
 86         }
 87     }
 88 
 89     /// <summary>
 90     /// 除法类
 91     /// </summary>
 92     class OperationDiv : Operation
 93     {
 94         public override double GetResult()
 95         {
 96             double result = 0;
 97             if (NumberB == 0)
 98                 throw new Exception("除数不能为0");
 99             result = NumberA / NumberB;
100             return result;
101         }
102     }
103 
104     /// <summary>
105     /// 简单工厂类
106     /// </summary>
107     class OperationFacory
108     {
109         public static Operation CreateOperate(string a)
110         {
111             Operation oper = null;
112             switch (a)
113             {
114                 case "+":
115                     oper = new OperationAdd();
116                     break;
117                 case "-":
118                     oper = new OperationSub();
119                     break;
120                 case "*":
121                     oper = new OperationMul();
122                     break;
123                 case "/":
124                     oper = new OperationDiv();
125                     break;
126             }
127             return oper;
128         }
129    
130     }
131 
132 /// <summary>
133     /// Client类
134     /// </summary>
135     class Program
136     {
137         static void Main(string[] args)
138         {            
139             Console.WriteLine("请输入数字A:");
140             string strNumberA = Console.ReadLine();
141             Console.WriteLine("请输入运算符(+、-、*、/):");
142             string strOperate = Console.ReadLine();
143             Console.WriteLine("输入数字B:");
144             string strNumberB = Console.ReadLine();
145 
146             Operation oper = OperationFacory.CreateOperate(strOperate);
147             oper.NumberA = Convert.ToDouble(strNumberA);
148             oper.NumberB = Convert.ToDouble(strNumberB);
149             Console.WriteLine("运算结果为:" + oper.GetResult());
150 
151             Console.ReadLine();
152         }
153     }

 

运行如下:

 

重点:UML图示:继承、实现、关联、依赖、聚合、组合关系的理解。

引用网上的一个总结,我觉得挺不错的:

对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引 用、横向关系,是比较难区分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;

难点:在理解UML基本图示,然后再理解简单工厂模式思想的基础上,能将UML转化为代码的能力。

这是一个循序渐进的过程,初学者也不用太着急。一步一步来会好的。

总结:

简单工厂的工厂类中:优点:包含了必要的逻辑判断,这样就可以根据客户端的条件来动态的实例化相关的类,同时除去了和具体类的直接依赖。

缺点:明显的是违背了开闭原则。例如在运算类中再继承一个新的类,工厂类中就需要添加新的逻辑判断。

所以就引入了抽象工厂模式、工厂模式的概念的,有兴趣的朋友可以自己去找些文档看看。

 

附上UML的实现代码:有需要的朋友可以下载。欢迎学习的朋友交流下自己的心得~

posted on 2012-11-08 23:59  皮皮卡  阅读(227)  评论(0)    收藏  举报