简单工厂模式(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 类) 实例化运算所需的运算子类.
这样设计的优点:
易扩展
如果添加新的运算类, 只需要
新的运算类继承 Operation 类, 并重写 GetResult()方法
在简单工厂类 (OperationFactory 类) 中添加对应的 if 语句
无需对其他运算类进行操作.
易维护
对某一运算类进行修改, 并不涉及其他运算类, 很大程度上避免了由于误操作而对其他运算类修改的问题.
低耦合
各运算类只公共继承 Operation 类, 不涉及其他运算类.
高复用
无论是控制台, 还是 Windows 程序, web 程序, 均可使用该程序实现计算器功能.
如果对您有用, 欢迎扫描下方二维码关注公众号, 会持续输出原创精彩文章, 与您一起深入学习 Python 中好用, 好玩的知识.
《大话设计模式》-- 简单工厂模式(Python 版)
来源: http://www.bubuko.com/infodetail-3344282.html