标签:ber res put method ati stat actor http 逻辑
给定一种输入,通过工厂实例出其合适的对象,称为简单工厂模式
2.逐步引入工厂模式
2.1 小文去面试,公司要求用任意一种面对对象的语言实现了一个计算器程序,功能只是简单的两个数相加或者减,乘,除
他的代码如下
def main(): num1 = int(input(‘The first number is:‘)) num2 = int(input(‘The second number is:‘)) op = input(‘The operator is( + - * /):‘) if op == ‘+‘: ret = num1 + num2 elif op == ‘-‘: ret = num1 - num2 elif op == ‘*‘: ret = num1 * num2 elif op == ‘/‘: ret = num1 / num2 return ret if __name__ == ‘__main__‘: ret = main() print(ret) ‘‘‘ The first number is:2 The second number is:3 The operator is( + - * /):+ 5 ‘‘‘
小文等了很久都没有接到公司的通知,小文的哥哥大文看了看小文的代码,摇了摇头:
1.没有用到面对对象的理念
2.if esle的效率很低,极端情况下回影响程序的效率
3.没有考虑除数为0的情况
4.重用性差,耦合度太高,应使用面对对象编程,将业务逻辑和界面逻辑分开,降低耦合度
2.2 小文修改了代码
operation运算类:
class Cal: def __init__(self, num1, num2): self.num1 = num1 self.num2 = num2 def Add(self): return self.num1 + self.num2 def Sub(self): return self.num1 - self.num2 def Mut(self): return self.num1 * self.num2 def Div(self): if self.num2 != 0: return self.num1 / self.num2 else: return ‘除数不能为0‘
客户端代码:
DIC = {‘+‘: ‘Add‘, ‘-‘: ‘Sub‘, ‘*‘: ‘Mut‘, ‘/‘: ‘Div‘, } def main(): num1 = int(input(‘The first number is:‘)) num2 = int(input(‘The second number is:‘)) op = input(‘The operator is( + - * /):‘) if hasattr(Cal, DIC[op]): func = getattr(Cal, DIC[op]) obj = Cal(num1, num2) ret = obj.func() print(ret) if __name__ == ‘__main__‘: main()
大文说:代码耦合性还是很高,假如增加平方根运算,却需要让+-*/都来参加编译
加减乘除运算应该分离,修改其中一个而不影响其他几个
增加面对对象集成继承的思想
2.3 小文修改了代码:
operation运算类与加减乘除类:
class Cal: def __init__(self, num1, num2): self.num1 = num1 self.num2 = num2 class Add(Cal): def GetResult(self): return self.num1 + self.num2 class Sub(Cal): def GetResult(self): return self.num1 - self.num2 class Mut(Cal): def GetResult(self): return self.num1 * self.num2 class Div(Cal): def GetResult(self): if self.num2 != 0: return self.num1 / self.num2 else: return ‘除数不能为0‘
小文说:我如何才能让计算器知道我是希望用哪个类去创建对象呢?
大文说:今天就叫你简单工厂模式,你只要输入运算符号,工厂就能实例化出合适的对象
2.4 大文写了以下代码
简单工厂类:
import lib DIC = {‘+‘: ‘Add‘, ‘-‘: ‘Sub‘, ‘*‘: ‘Mut‘, ‘/‘: ‘Div‘, } class operationFactory: @staticmethod def creatObj(operator, num1, num2): if hasattr(lib, DIC[operator]): class1 = getattr(lib, DIC[operator]) obj = class1(num1, num2) return obj
客户端代码:
def main(): num1 = int(input(‘The first number is:‘)) num2 = int(input(‘The second number is:‘)) op = input(‘The operator is( + - * /):‘) obj = operationFactory.creatObj(op, num1, num2) ret = obj.GetResult() print(ret) if __name__ == ‘__main__‘: main()
大文说:以后我们更改加法算法,只需要改lib.py中的Add就可以了
当我们需要增加各种复杂运算,只需要增加相应的子类即可,并且在DIC字典中增加相应的元素,方便
类工厂中的放射能找到对应的类名即可。
2.5 最后我们看一下这几个类的结构图:
标签:ber res put method ati stat actor http 逻辑
原文地址:http://www.cnblogs.com/wuwen19940508/p/7082166.html