使用简单工厂模式来进行Python的设计模式编程


Posted in Python onMarch 01, 2016

计模式的目的是让代码易维护、易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的。

简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式。这个模式的基本工作方式: 通过一个工厂来决定创建哪种具体的产品实例。

下面是一个简单的工厂实例:

def create_animal(name):
 if name == 'dog':
  return Dog()
 elif name == 'cat':
  return Cat()

animal = create_animal('dog')
animal.eat('some food')

create_animal就是一个工厂,各种动物就是产品,该工厂根据name来决定产出什么动物产品。产品应该具有一个基本特性,同一个工厂出产的所有产品都是一个系列,都具有相同的功能,比如动物都吃食物。

简单工厂模式的好处是可以将产品对象的细节封装在其实现类的内部,改变一个产品对象具体实现不会影响其他产品。可扩展性强,当需要新增产品类型时,只需要添加对应的实现类,然后修改工厂,增加一个判断分支即可。修改工厂函数带来的风险比较低。

另外一个比较典型的适合简单工厂模式的例子是计算器,计算器需要支持各种计算操作,比如加、减、乘、除、平方、立方、平方根、阶乘等等。那么这里的工厂就是要创建各种操作算法对象,每种操作算法对象都支持一个求值方法。

def create_operator(op):
 if op == '+':
  return AddOperation()
 elif op == '-':
  return SubOperation()
 elif op == '*':
  return MulOperation()
 elif op == '/':
  return DivOperation()

op = create_operator('+')
op.Calc(1, 2)

前面提到,每个工厂生产的产品都是一个系列的,因此产品类通常会从同一个抽象基类派生,但不是必须的。

简单工厂模式的组成要素:
工厂函数:负责具体产品对象的创建工作,是该模式的核心。当场景比较复杂时,可能需要用一个工厂类来负责产品的创建。
以及产品的抽象接口或抽象类、抽象所有产品的公共接口、具体产品类、抽象接口的具体实现类。

缺点:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中
它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

使用场景:
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。


eg:采用简单工厂模式实现计算器

#encoding=utf-8 
# 
#by panda 
#简单工厂模式 
 
class OperateBase(): 
 result = 0; 
 def GetResult(self): 
  return self.result; 
 
class OperationAdd(OperateBase): 
 def __init__(self, NumA, NumB): 
  self.result = NumA + NumB; 
 def GetResult(self): 
  return self.result;   
  
class OperationSub(OperateBase): 
 def __init__(self, NumA, NumB): 
  self.result = NumA - NumB; 
 def GetResult(self): 
  return self.result; 
  
class OperationMult(OperateBase): 
 def __init__(self, NumA, NumB): 
  self.result = NumA * NumB; 
 def GetResult(self): 
  return self.result; 
 
class OperationDiv(OperateBase): 
 def __init__(self, NumA, NumB): 
  self.result = NumA / NumB; 
 def GetResult(self): 
  return self.result; 
 
class OperationFactory(): 
 @staticmethod 
 def createOperate(operate, NumA, NumB): 
  optList = { 
  '+':OperationAdd, 
  '-':OperationSub, 
  '*':OperationMult, 
  '/':OperationDiv,   
  } 
  oper = OperateBase() 
  if(optList.has_key(operate)): 
   oper = optList[operate](NumA, NumB);   
  return oper 
 
 
def clientUI(): 
 opt = raw_input("please input a operation(+-*/): "); 
 NumA = raw_input("please input the first number: "); 
 NumB = raw_input("please input the second number: ");  
 oper = OperationFactory.createOperate(opt, float(NumA), float(NumB)) 
 print "Restlt: ", oper.GetResult() 
 return 
 
if __name__ == '__main__': 
 clientUI();

UML类图如下:

使用简单工厂模式来进行Python的设计模式编程

Python 相关文章推荐
django实现用户登陆功能详解
Dec 11 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
Python使用type关键字创建类步骤详解
Jul 23 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
Aug 28 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
python烟花效果的代码实例
Feb 25 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 Python
django中的数据库迁移的实现
Mar 16 Python
使用django自带的user做外键的方法
Nov 30 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 Python
Python文件处理
Feb 29 #Python
python 默认参数问题的陷阱
Feb 29 #Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 #Python
Python中time模块和datetime模块的用法示例
Feb 28 #Python
python 写的一个爬虫程序源码
Feb 28 #Python
Python基础语法(Python基础知识点)
Feb 28 #Python
python中map()与zip()操作方法
Feb 27 #Python
You might like
php设计模式之观察者模式的应用详解
2013/05/21 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
AngularJS路由Ui-router模块用法示例
2017/05/29 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
2018/11/21 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
在Django中创建动态视图的教程
2015/07/15 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
土木建筑学生自我评价
2014/01/14 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
三年级学生评语大全
2014/12/26 职场文书
护士个人年度总结范文
2015/02/13 职场文书
手术室消毒隔离制度
2015/08/05 职场文书