python的编程模式-使用简单工厂模式来进行Python的设计模式编程
计模式的目的是让代码易维护、易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的。
简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式。这个模式的基本工作方式: 通过一个工厂来决定创建哪种具体的产品实例。
下面是一个简单的工厂实例:
?
1
2
3
4
5
6
7
8
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来决定产出什么动物产品。产品应该具有一个基本特性,同一个工厂出产的所有产品都是一个系列,都具有相同的功能,比如动物都吃食物。
简单工厂模式的好处是可以将产品对象的细节封装在其实现类的内部,改变一个产品对象具体实现不会影响其他产品。可扩展性强,当需要新增产品类型时,只需要添加对应的实现类,然后修改工厂,增加一个判断分支即可。修改工厂函数带来的风险比较低。
另外一个比较典型的适合简单工厂模式的例子是计算器,计算器需要支持各种计算操作,比如加、减、乘、除、平方、立方、平方根、阶乘等等。那么这里的工厂就是要创建各种操作算法对象,每种操作算法对象都支持一个求值方法。
?
1
2
3
4
5
6
7
8
9
10
11
12
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:采用简单工厂模式实现计算器
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#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的设计模式编程相关推荐
- java简单工厂模式_Java 简单工厂模式
Java 简单工厂模式 2014-05-28·WeaponX 3717 次浏览 ## 介绍 简单工厂模式又称静态工厂模式. 简单工厂模式由工厂类角色.抽象产品角色和具体产品角色组成. 工厂类角色是本模 ...
- 设计模式—工厂模式之简单工厂模式
1. 简单工厂模式简介 简单工厂模式(Simple Factory),又被称为"静态工厂方法模式".它属于"创建模式"(创建对象的模式),并且是"工厂 ...
- 策略模式与简单工厂模式区别(转)
最近一直在抽时间研究设计模式,之前对设计模式也有一定的了解,但是都没有平心静气的去研究过,只是了解了一些皮毛,最近打算再深入研究一下,重新打开了设计模式的数据,对之前的疑问一个个的刨根问底,今天看了简 ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- 设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)
工厂方法模式 概念 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 . 工厂方法模式的意义 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中. 核心工厂类不再负责产品的创建,这样核 ...
- 大话设计模式-策略模式与简单工厂模式
来源:http://blog.csdn.net/wulingmin21/article/details/6712684 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策 ...
- 工厂模式——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3) ...
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...
- GOLANG工厂模式、简单工厂模式、抽象工厂模式、创建者模式
设计模式可以大大提高代码复用性,使得程序的修改更加灵活.另外将各个功能模块抽象解耦出来,在某个模块需要更改时不至于会对整体代码进行修改,解耦的好的话只简单修改几个地方即可以切换某个模块在实现上的切换, ...
- 设计模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
声明: 本博客参考C语言中文网:C语言中文网连接 主要记录学习以下内容: 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 每个大要点都主要包括以下两部分内容: (1)基本概念和模型结构(包括一些 ...
最新文章
- Android Scroller 使用详解
- 开发者工具 Top 100 名单
- 功能自动化工具watiJ(转载)
- 主存块和cache块关系_Cache(直接相联)
- 空间数据引擎oracle_GIS 与Oracle 数据库空间数据格式的转换
- MOCTF-Web-没时间解释了
- 深度有趣 | 30 快速图像风格迁移
- 浅谈Java网络编程之Socket (1)
- python 验证数据类型函数
- integer java 随机_如何在Java中生成随机BigInteger值?
- 使用python制作聊天框解谜游戏_使用Python写一个小游戏alien invasion!
- 【QT】QT从零入门教程(七):图像适应窗口
- vmware10中开启Intel VT-x
- 更新 FF.PyAdmin v1.2
- 汇编语言典型例子详解_单片机汇编语言经典一百例
- 未来能源互联网技术革命,能源产业大数据应用解析
- 对vue与angular和react的对比
- Android中你不得不知的几个问题及解决方法
- 嵌入式开发 SRAM SROM DRAM DROM DDR NAND FLASH EMMC 区别
- 视频教程-沐风老师Scratch3.0快速入门视频课程-其他
热门文章
- (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节
- LightOJ - 1265 概率
- 编译报错一列----aclocal找不到
- jQuery 在Table中选择input之类的东西注意事项
- 依赖注入及AOP简述(一)——“依赖”的概念 .
- C/C++中各种类型int、long、double、char表示范围(最大最小值)
- CSS的clip-path
- 视频编码名词参数解释——非常全面详细
- iOS 字符串加密至MD5
- linux shell 脚本实现tcp/upd协议通讯(重定向应用)