《大话设计模式》——简单工厂模式(Python版)
简单工厂模式(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版)的更多相关文章
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- 3. 星际争霸之php设计模式--简单工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- Python 设计模式--简单工厂模式
简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算 ...
- linkin大话设计模式--简单工厂
linkin大话设计模式--工厂方法 什么是工厂方法:将多个类对象交给工厂来生成的设计被称为简单工厂模式,个人认为主要是为了实现解耦,在代码重构的时候会很重要. 代码如下: public class ...
- 大话设计模式之工厂模式 C#
学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 大话设计模式一书中第一个开讲的设计模式是简单工厂模式,关于简单工厂模式大家可参考鄙人的博客:代 ...
- C++设计模式——简单工厂模式
简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...
- 深入浅出设计模式——简单工厂模式(Simple Factory)
介绍简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想 ...
- C#设计模式--简单工厂模式
简单工厂模式是属于创建型模式,但不属于23种GOF设计模式之一. 举一个例子:一个公司有不同的部门,客户根据需要打电话到不同的部门.客户相当于上端,不同部门相当于下端.不使用简单工厂模式来实现的例子如 ...
- 设计模式 | 简单工厂模式(static factory method)
按理说应该把书全都看完一遍,再开始写博客比较科学,会有比较全面的认识. 但是既然都决定要按规律更新博客了,只能看完一个设计模式写一篇了. 也算是逼自己思考了,不是看完就过,至少得把代码自己都敲一遍. ...
随机推荐
- .NET高级特性-Emit(2.1)字段
在上篇blog写完的几天后,有读者反映写的过于复杂,导致无法有效的进行实践:博主在考虑到园子里程序员水平高低不一致的情况,所以打算放慢脚步,对类的一些内容进行详细的讲解,顺带的会写一些笔者所遇到过的E ...
- 使用FastReport报表工具生成图片格式文档
之前我在随笔<使用FastReport报表工具生成报表PDF文档>介绍过使用FastReport.Net来根据报表模板进行生成PDF,以及随笔<使用FastReport报表工具生成标 ...
- 【Android - 组件】之IntentFilter的匹配规则
我们知道,Activity的启动模式分为两种,分别是显式启动和隐式启动.显式启动需要明确的指定被启动的对象的组件信息,包括包名和类名:而隐式启动需要 Intent 能够匹配目标组件的 IntentFi ...
- lvm_lv_extend
根分区lv扩容 xfs格式 neokylinV7.0 [root@localhost ~]# fdisk /dev/vda 欢迎使用 fdisk (util-linux 2.23.2). 更改将停留在 ...
- 基本shell脚本
#!/bin/bash attr=() num= while true do read -p ">>input:" name attr[$num]=$name echo ...
- Java学习笔记(面向对象上)
面向对象(上) 面向对象的特点:封装性(是面向对象的核心思想,将对象的属性和行为封装起来).继承性(主要描述类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展)和多态 ...
- 【LiteOS】LiteOS移植常见问题
发现很多人在LiteOS的移植过程中总会遇到一些问题,现在简单做一些总结.后续有新的问题提再继续补充. 1.CMSIS版本导致的问题 问题现象一般如下图所示,编译后报错,Undefined symbo ...
- 转:mysql 安装失败 start service执行不下去
简单说一下自己安装mysql的经历坑点,新手应该都会遇到.新买了一个电脑,第一次安装的情况:在网上下载好几个不同的mysql,安装都在最后一步执行的时候,执行不下去,最后打开客户端,就是闪一下就消失了 ...
- L1 loss, L2 loss以及Smooth L1 Loss的对比
总结对比下\(L_1\) 损失函数,\(L_2\) 损失函数以及\(\text{Smooth} L_1\) 损失函数的优缺点. 均方误差MSE (\(L_2\) Loss) 均方误差(Mean Squ ...
- set容器
set容器简介: 1) set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2) set采用红黑树变体的数据结构实现,红 ...