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

作者:BlueWish 时间:2021-02-17 11:53:50 

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

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

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


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,设计模式
0
投稿

猜你喜欢

  • 使用 Osql 工具管理 SQL Server 桌面引擎 (MSDE 2000)应用介绍

    2020-07-01 22:12:59
  • 如何用Python对数学函数进行求值、求偏导

    2023-10-13 04:58:01
  • tensorflow自定义激活函数实例

    2023-04-18 09:11:51
  • Vue+Axios实现文件上传自定义进度条

    2024-05-29 22:24:57
  • 教你使用python搭建一个QQ机器人实现叫起床服务

    2021-04-22 02:25:41
  • 用Python实现BP神经网络(附代码)

    2023-11-24 17:20:11
  • Python实现TCP/IP协议下的端口转发及重定向示例

    2021-10-03 04:30:11
  • xWin的HTC分享

    2009-09-13 18:50:00
  • 实例演示在SQL中启用全文检索

    2011-10-01 14:01:37
  • asp程序定义变量比不定义变量速度快一倍

    2012-12-04 20:06:32
  • python使用xlsxwriter实现有向无环图到Excel的转换

    2022-01-24 06:42:54
  • go之如何设置GOROOT和GOPATH

    2023-07-19 21:27:24
  • Python3.5迭代器与生成器用法实例分析

    2022-11-03 14:50:47
  • python 负数取模运算实例

    2022-06-17 00:50:49
  • Django城市信息查询功能的实现步骤

    2023-09-01 21:28:48
  • Python3使用requests登录人人影视网站的方法

    2021-10-04 15:42:19
  • python利用Excel读取和存储测试数据完成接口自动化教程

    2022-04-02 05:25:13
  • 基于Python爬取股票数据过程详解

    2021-02-27 08:42:18
  • 解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题

    2024-04-16 09:26:21
  • JavaScript的instanceof运算符学习教程

    2024-04-17 10:09:59
  • asp之家 网络编程 m.aspxhome.com