简单工厂模式(Simple Factory Pattern)是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.

例:

使用Python设计一个控制台计算器,要求输入两个数和运算符号,得到运算结果。

1. 初学者写法

  1. class Operation(object):
  2. def __init__(self):
  3. pass
  4. def conver_strNumber(self, strNumber):
  5. '''
  6. 将字符串格式的数字,转化成对应格式的数字
  7. :param strNumber:
  8. :return:
  9. '''
  10. if '.' not in strNumber:
  11. return int(strNumber)
  12. else:
  13. return float(strNumber)
  14. def op(self, strNumberA, strNumberB, strOperate):
  15. if strOperate == '+':
  16. return self.conver_strNumber(strNumberA) + self.conver_strNumber(strNumberB)
  17. elif strOperate == '-':
  18. return self.conver_strNumber(strNumberA) - self.conver_strNumber(strNumberB)
  19. elif strOperate == '*':
  20. return self.conver_strNumber(strNumberA) * self.conver_strNumber(strNumberB)
  21. elif strOperate == '/':
  22. if strNumberB != '0' and strNumberB != '0.0':
  23. return self.conver_strNumber(strNumberA) / self.conver_strNumber(strNumberB)
  24. else:
  25. return 0
  26. else:
  27. print('只能做加减乘除运算')
  28. if __name__ == '__main__':
  29. p = Operation()
  30. print(p.op('2.2', '1', '+'))
  31. # 输出
  32. 21.2

分析:以上这种写法,将加减乘除运算全部放在一个类中实现,虽然实现了计算器的功能,但增加其他运算或修改某个运算都必须在Operation类中进行修改。 使得程序不容易维护、扩展以及复用,并且耦合性高

2.使用简单工厂模式

  1. # Operation运算类
  2. class Operation(object):
  3. def __init__(self, strNumberA=0, strNumberB=0):
  4. self.NumberA = strNumberA
  5. self.NumberB = strNumberB
  6. def conver_strNumber(self, strNumber):
  7. '''
  8. 将字符串格式的数字,转化成对应格式的数字
  9. :param strNumber:
  10. :return:
  11. '''
  12. if '.' not in strNumber:
  13. return int(strNumber)
  14. else:
  15. return float(strNumber)
  16. def GetResult(self):
  17. pass
  18. # 加法运算类
  19. class OperationAdd(Operation):
  20. def GetResult(self):
  21. return self.conver_strNumber(self.NumberA) + self.conver_strNumber(self.NumberB)
  22. # 减法运算类
  23. class OperationSub(Operation):
  24. def GetResult(self):
  25. return self.conver_strNumber(self.NumberA) - self.conver_strNumber(self.NumberB)
  26. # 乘法运算类
  27. class OperationMul(Operation):
  28. def GetResult(self):
  29. return self.conver_strNumber(self.NumberA) * self.conver_strNumber(self.NumberB)
  30. # 除法运算类
  31. class OperationDiv(Operation):
  32. def GetResult(self):
  33. if self.NumberB != 0 and self.NumberB != 0.0:
  34. return self.conver_strNumber(self.NumberA) / self.conver_strNumber(self.NumberB)
  35. else:
  36. return '除数不能为0'
  37. # 其他操作符运算
  38. class OperationUndef(Operation):
  39. def GetResult(self):
  40. return '操作符错误'
  41. # 简单工厂类
  42. class OperationFactory(object):
  43. def createOperate(self, operate):
  44. if operate == '+':
  45. return OperationAdd()
  46. elif operate == '-':
  47. return OperationSub()
  48. elif operate == '*':
  49. return OperationMul()
  50. elif operate == '/':
  51. return OperationDiv()
  52. else:
  53. return OperationUndef()
  54. if __name__ == '__main__':
  55. strNumA = '1.0'
  56. strNumB = '2'
  57. oper = '/'
  58. OP = OperationFactory()
  59. oper_obj = OP.createOperate(oper)
  60. oper_obj.NumberA = strNumA
  61. oper_obj.NumberB = strNumB
  62. result = oper_obj.GetResult()
  63. print(result)
  64. # 输出
  65. 0.5

分析:将各种运算拆分成单独的类,均继承于Operation类,各运算子类重写Operation类中的GetResult()方法。统一通过简单工厂类(OperationFactory类)实例化运算所需的运算子类。

这样设计的优点:

  • 易扩展

    如果添加新的运算类,只需要

    1. 新的运算类继承Operation类,并重写GetResult()方法
    2. 在简单工厂类(OperationFactory类)中添加对应的if语句

    无需对其他运算类进行操作。

  • 易维护

    对某一运算类进行修改,并不涉及其他运算类,很大程度上避免了由于误操作而对其他运算类修改的问题。

  • 低耦合

    各运算类只公共继承Operation类,不涉及其他运算类。

  • 高复用

    无论是控制台,还是windows程序,Web程序,均可使用该程序实现计算器功能。


如果对您有用,欢迎扫描下方二维码关注公众号,会持续输出原创精彩文章,与您一起深入学习Python中好用、好玩的知识。

《大话设计模式》——简单工厂模式(Python版)的更多相关文章

  1. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...

  2. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. Golang设计模式—简单工厂模式(Simple Factory Pattern)

    Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...

  4. Python 设计模式--简单工厂模式

    简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算 ...

  5. linkin大话设计模式--简单工厂

    linkin大话设计模式--工厂方法 什么是工厂方法:将多个类对象交给工厂来生成的设计被称为简单工厂模式,个人认为主要是为了实现解耦,在代码重构的时候会很重要. 代码如下: public class ...

  6. 大话设计模式之工厂模式 C#

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 大话设计模式一书中第一个开讲的设计模式是简单工厂模式,关于简单工厂模式大家可参考鄙人的博客:代 ...

  7. C++设计模式——简单工厂模式

    简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...

  8. 深入浅出设计模式——简单工厂模式(Simple Factory)

    介绍简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想 ...

  9. C#设计模式--简单工厂模式

    简单工厂模式是属于创建型模式,但不属于23种GOF设计模式之一. 举一个例子:一个公司有不同的部门,客户根据需要打电话到不同的部门.客户相当于上端,不同部门相当于下端.不使用简单工厂模式来实现的例子如 ...

  10. 设计模式 | 简单工厂模式(static factory method)

    按理说应该把书全都看完一遍,再开始写博客比较科学,会有比较全面的认识. 但是既然都决定要按规律更新博客了,只能看完一个设计模式写一篇了. 也算是逼自己思考了,不是看完就过,至少得把代码自己都敲一遍. ...

随机推荐

  1. 解决php使用支付宝SDK报错问题

    最近公司将一些项目转移了服务器,后来发现使用支付宝支付时发现出现错误,错误如下: 1 The each() function is deprecated. This message will be s ...

  2. Maven入门【小白千万别点进】

    曾经有个女孩问我为什么要学Maven,我吧唧嘴就怼:Maven项目没有jar包它不香嘛,照样运行它不香嘛?如果让我一句话形容Maven,我会这样形容:"妈妈再也不用担心小明拿U盘去小红电脑里 ...

  3. MySql分库分表与分区的区别和思考

    一.分分合合 说过很多次,不要拘泥于某一个技术的一点,技术是相通的.重要的是编程思想,思想是最重要的.当数据量大的时候,需要具有分的思想去细化粒度.当数据量太碎片的时候,需要具有合的思想来粗化粒度. ...

  4. day 13 生成器函数 表达式 推导式

    今日主要内容 1. 生成器和生成器函数 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 2.通过生成器表达式创建生成器 3.通过数据转换 2. 生成器函数: 函数中包含了yield ...

  5. python数据分析pandas中的DataFrame数据清洗

    pandas中的DataFrame中的空数据处理方法: 方法一:直接删除 1.查看行或列是否有空格(以下的df为DataFrame类型,axis=0,代表列,axis=1代表行,以下的返回值都是行或列 ...

  6. 个人收藏--未整理—C# http/https 上传下载文件

    c# HTTP/HTTPS 文件上传. 分类: .net 2015-02-03 08:36 541人阅读 评论(0) 收藏 举报 方法主体 [csharp] view plaincopy public ...

  7. Mybatis一级缓存和二级缓存总结

    1:mybatis一级缓存:级别是session级别的,如果是同一个线程,同一个session,同一个查询条件,则只会查询数据库一次 2:mybatis二级缓存:级别是sessionfactory级别 ...

  8. 程序员的进阶课-架构师之路(13)-B-树

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  9. diff()函数的使用

    1.diff():返回略微迭代(lagged)的或滞后的不同(iterated diferences). > x<-cumsum(cumsum(1:10)) > x [1] 1 4 ...

  10. python基本文件操作

    python文件操作 python的文件操作相对于java复杂的IO流简单了好多,只要关心文件的读和写就行了 基本的文件操作 要注意的是,当不存在某路径的文件时,w,a模式会自动新建此文件夹,当读模式 ...