标签: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