使用简单工厂模式来进行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 相关文章推荐
python二叉树的实现实例
Nov 21 Python
python调用cmd命令行制作刷博器
Jan 13 Python
在Python的Django框架中显示对象子集的方法
Jul 21 Python
Django中的CACHE_BACKEND参数和站点级Cache设置
Jul 23 Python
Django1.9 加载通过ImageField上传的图片方法
May 25 Python
python简单贪吃蛇开发
Jan 28 Python
Python实现Restful API的例子
Aug 31 Python
Python面向对象编程基础实例分析
Jan 17 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
Python Flask框架实现简单加法工具过程解析
Jun 03 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 Python
Python+pyaudio实现音频控制示例详解
Jul 23 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
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
2017/09/02 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
jquery remove方法应用详解
2012/11/22 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
python转换摩斯密码示例
2014/02/16 Python
python写入中英文字符串到文件的方法
2015/05/06 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
解析python实现Lasso回归
2019/09/11 Python
python 有效的括号的实现代码示例
2019/11/11 Python
python代码如何实现余弦相似性计算
2020/02/09 Python
解决python运行效率不高的问题
2020/07/20 Python
详解python中的闭包
2020/09/07 Python
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
作为网站管理者应当如何防范XSS
2014/08/16 面试题
Python文件操作的面试题
2013/06/22 面试题
师德师风学习材料
2014/12/19 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
Golang中channel的原理解读(推荐)
2021/10/16 Golang