简单工厂模式(Simple Factory Pattern)是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.

例:

使用Python设计一个控制台计算器,要求输入两个数和运算符号,得到运算结果。

1. 初学者写法

class Operation(object):

    def __init__(self):
pass def conver_strNumber(self, strNumber):
'''
将字符串格式的数字,转化成对应格式的数字
:param strNumber:
:return:
'''
if '.' not in strNumber:
return int(strNumber)
else:
return float(strNumber) def op(self, strNumberA, strNumberB, strOperate):
if strOperate == '+':
return self.conver_strNumber(strNumberA) + self.conver_strNumber(strNumberB)
elif strOperate == '-':
return self.conver_strNumber(strNumberA) - self.conver_strNumber(strNumberB)
elif strOperate == '*':
return self.conver_strNumber(strNumberA) * self.conver_strNumber(strNumberB)
elif strOperate == '/':
if strNumberB != '0' and strNumberB != '0.0':
return self.conver_strNumber(strNumberA) / self.conver_strNumber(strNumberB)
else:
return 0
else:
print('只能做加减乘除运算') if __name__ == '__main__':
p = Operation()
print(p.op('2.2', '1', '+')) # 输出
21.2

分析:以上这种写法,将加减乘除运算全部放在一个类中实现,虽然实现了计算器的功能,但增加其他运算或修改某个运算都必须在Operation类中进行修改。 使得程序不容易维护、扩展以及复用,并且耦合性高

2.使用简单工厂模式

# Operation运算类
class Operation(object):
def __init__(self, strNumberA=0, strNumberB=0):
self.NumberA = strNumberA
self.NumberB = strNumberB def conver_strNumber(self, strNumber):
'''
将字符串格式的数字,转化成对应格式的数字
:param strNumber:
:return:
'''
if '.' not in strNumber:
return int(strNumber)
else:
return float(strNumber) def GetResult(self):
pass # 加法运算类
class OperationAdd(Operation):
def GetResult(self):
return self.conver_strNumber(self.NumberA) + self.conver_strNumber(self.NumberB) # 减法运算类
class OperationSub(Operation):
def GetResult(self):
return self.conver_strNumber(self.NumberA) - self.conver_strNumber(self.NumberB) # 乘法运算类
class OperationMul(Operation):
def GetResult(self):
return self.conver_strNumber(self.NumberA) * self.conver_strNumber(self.NumberB) # 除法运算类
class OperationDiv(Operation):
def GetResult(self):
if self.NumberB != 0 and self.NumberB != 0.0:
return self.conver_strNumber(self.NumberA) / self.conver_strNumber(self.NumberB)
else:
return '除数不能为0' # 其他操作符运算
class OperationUndef(Operation):
def GetResult(self):
return '操作符错误' # 简单工厂类
class OperationFactory(object):
def createOperate(self, operate):
if operate == '+':
return OperationAdd()
elif operate == '-':
return OperationSub()
elif operate == '*':
return OperationMul()
elif operate == '/':
return OperationDiv()
else:
return OperationUndef() if __name__ == '__main__': strNumA = '1.0'
strNumB = '2'
oper = '/' OP = OperationFactory()
oper_obj = OP.createOperate(oper)
oper_obj.NumberA = strNumA
oper_obj.NumberB = strNumB
result = oper_obj.GetResult()
print(result) # 输出
0.5

分析:将各种运算拆分成单独的类,均继承于Operation类,各运算子类重写Operation类中的GetResult()方法。统一通过简单工厂类(OperationFactory类)实例化运算所需的运算子类。

这样设计的优点:

  • 易扩展

    如果添加新的运算类,只需要

    1. 新的运算类继承Operation类,并重写GetResult()方法
    2. 在简单工厂类(OperationFactory类)中添加对应的if语句

    无需对其他运算类进行操作。

  • 易维护

    对某一运算类进行修改,并不涉及其他运算类,很大程度上避免了由于误操作而对其他运算类修改的问题。

  • 低耦合

    各运算类只公共继承Operation类,不涉及其他运算类。

  • 高复用

    无论是控制台,还是windows程序,Web程序,均可使用该程序实现计算器功能。


如果对您有用,欢迎扫描下方二维码关注公众号,会持续输出原创精彩文章,与您一起深入学习Python中好用、好玩的知识。

《大话设计模式》——简单工厂模式(Python版)-LMLPHP

05-11 13:29