跟皮皮卡读大话设计模式(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的实现代码:有需要的朋友可以下载。欢迎学习的朋友交流下自己的心得~

浙公网安备 33010602011771号