使用简单工厂模式来进行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 相关文章推荐
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
Dec 04 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
python实现简易通讯录修改版
Mar 13 Python
python使用turtle库绘制时钟
Mar 25 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
Jan 14 Python
使用python绘制cdf的多种实现方法
Feb 25 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
Python request使用方法及问题总结
Apr 26 Python
Python接收手机短信的代码整理
Aug 02 Python
matplotlib制作雷达图报错ValueError的实现
Jan 05 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
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
php获取域名的google收录示例
2014/03/24 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
php while循环控制的简单实例
2016/05/30 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
JQuery1.6 使用方法三
2011/11/23 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
大专毕业生自我评价分享
2013/11/10 职场文书
师范毕业生个人求职信
2013/12/09 职场文书
影视动画专业个人的自我评价
2013/12/31 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
Django模型层实现多表关系创建和多表操作
2021/07/21 Python