下面考虑《大话设计模式》中的一个例子:
题目:用任意一种面向对象语言实现一个计算器控制台程序。要求输入两个数和运算符号,得到结果。
题目分析:
程序应该做到:(1)可维护;(2)可复用;(3)可扩展;(4)灵活性好。
可维护:就是说代码一处更改,不能产生连锁反应,不能影响其他地方。
可复用:尽量减少重复性代码。
可扩展:如果要扩展新的功能、新的业务,则只需要增加新的类就好了,不对已有的类和逻辑产生影响。插拔式的应用。
面向对象要点:
面向对象三大特性:封装、继承、多态。
通过封装、继承、多态把程序耦合降低。
业务逻辑和界面逻辑分开。
1 # coding=utf-8 2 # 简单工厂模式的介绍及代码实例 3 # 举个加减乘除的例子 4 # 定义一个父类,预留接口 5 class Operation(object): 6 def __init__(self, num1 = 0, num2 = 0): 7 self.num1 = num1 8 self.num2 = num2 9 10 # 这是一个预留的统一的接口,子类可以根据自己的情况调用这个接口,实现自己的特殊功能 11 def get_result(self): 12 pass 13 14 15 class Add(Operation): 16 def get_result(self): 17 return self.num1 + self.num2 18 19 class Minus(Operation): 20 def get_result(self): 21 return self.num1 - self.num2 22 23 class Multi(Operation): 24 def get_result(self): 25 return self.num1 * self.num2 26 27 class Divide(Operation): 28 def get_result(self): 29 try: 30 return self.num1/self.num2 31 except: 32 return '被除数不能为0,请重新输入' 33 34 # 这个就是一个工厂,根据用户的输入选择来调用相应的类去创建实例完成任务 35 class OptionFactory(): 36 def choose(self,op): 37 if op == '+': 38 return Add() 39 if op == '-': 40 return Minus() 41 if op == '*': 42 return Multi() 43 if op == '/': 44 return Divide() 45 46 # 根据用户输入来决定调用哪个类,这就是工厂类的作用 47 if __name__ == '__main__': 48 ch = '' 49 while not ch == 'q': 50 num1 = eval(raw_input('Please input number1: ')) 51 op = str(raw_input('Please input the operation: ')) 52 num2 = eval(raw_input('Please input number2: ')) 53 OPFactory = OptionFactory() 54 OPType = OPFactory.choose(op) 55 OPType.num1 = num1 56 OPType.num2 = num2 57 print 'The result is:', OPType.get_result() 58 try: 59 ch = str(raw_input()) 60 except: 61 ch = ''