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

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

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

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)

前面提到,每个工厂生产的产品都是一个系列的,因此产品类通常会从同一个抽象基类派生,但不是必须的。

简单工厂模式的组成要素

工厂函数

负责具体产品对象的创建工作,是该模式的核心。当场景比较复杂时,可能需要用一个工厂类来负责产品的创建。

产品的抽象接口或抽象类

抽象所有产品的公共接口

具体产品类

抽象接口的具体实现类

缺点

由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中

它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了

当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

使用场景

工厂类负责创建的对象比较少;

客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;

由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

python工厂模式 简书_[Python设计模式] 01 - 简单工厂模式相关推荐

  1. 工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)

    简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧.为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习. 1  场景问题 ...

  2. python工厂模式 简书_工厂

    思考题 public void printMenu() { PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); ArrayList ...

  3. python工厂模式 简书_工厂模式

    什么是工厂设计模式? 定义一个用于创建对象的接口,让子类决定将哪一个类实例化,专门用来生产对象.在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如 ...

  4. 用 python selenium 爬简书,Python自动化领域之 Selenium WebDriver 学习第2篇

    本篇博客使用 selenium 实现对简书官网的操作. 文章目录 通过 selenium 执行 JS selenium 实现简书搜索 selenium 隐式与显式等待 selenium 采集京东图书 ...

  5. python 数据挖掘 简书_[Python数据挖掘入门与实践]-第一章开启数据挖掘之旅

    1.数据挖掘简介(略) 2.使用Python和IPython Notebook 2.1.安装Python 2.2.安装IPython 2.3.安装scikit-learn scikit-learn是用 ...

  6. 小甲鱼python课后题简书_【Python爬虫】-笨办法学 Python 习题01-10

    一.作业内容: 01.将下面的内容写到一个文件中,取名为ex1.py.这个命名方式很重要,Python文件最好以.py结尾. 1 print "Hello World!" 2 pr ...

  7. python 串口助手 简书_[pyqt5-pyserial实现一个串口调试工具记录]

    遇到的问题 1. 程序结构 创建一个主窗口的类:在里面主要实现窗口UI的绘制,并定义一些槽函数接口 创建主框架类:该类继承自主窗口类,并实现主窗口类中的槽函数,在该类中创建串口接收线程 串口接收线程类 ...

  8. python飞机大战简书_飞机大战(pygame)开发实录一

    飞机大战,算是面向对象的程序语言入门必修程序,但大多教程只是点到为止,跳过了很多实际开发会遇到的问题,自然也错过了很多不错的经验.该系列文章针对python的pygame包,详细讲解了飞机大战的开发. ...

  9. python进行数据分析 简书_《利用python进行数据分析》读书笔记1

    读取json内容: import json path='路径\文件名.txt' records=[json.loads(line) for line in open(path)] #records为由 ...

最新文章

  1. 我的网站搭建 (第十七天) celery 定时刷新缓存
  2. More is better
  3. 【ARM】Tiny4412裸板编程之异常(软中断)
  4. 分布式理论(七): 一致性协议之 ZAB
  5. 获取验证码canvas
  6. cookie读取中文时乱码
  7. 你的知识死角不能否定你的技术能力
  8. python如何循环使用input_python基础知识input到while循环
  9. openwrt首次登录密码_什么是路由器登录密码 路由器登录密码介绍【详解】
  10. Hadoop的环境搭建
  11. 2021年2月十大热门报告盘点(附百大热门报告列表及下载链接)
  12. Android 异步获取网络图片并处理图片Out Of Memory 内存溢出问题
  13. Python 运维中20个常用的库和模块,总有一个用的到~
  14. 安装keepalived高可用(双实例)
  15. vb access mysql数据库教程_VB操作access数据库
  16. HDU 6191 2017广西邀请赛Query on A Tree:可持久化01字典树(区间抑或最大值查询)
  17. HITB_Binary_100_writeup
  18. AndroidTV开发-实现APP开机自启动
  19. 快速云:管理企业中云蔓延的7个技巧
  20. 基于STM32的AD9854模块调试总结

热门文章

  1. C++常见面试题,来看看你会几个~~
  2. php 存储过程 sqlsrv_query,php-PHP如何得用sqlsrv函数来调用MSSQL中的存储过程,并返回数据集?...
  3. 数字U家,即刻出发!2022联合利华黑客马拉松报名倒计时!
  4. 送你一份后端必备的 Git 分支开发规范指南
  5. Java多线程学习三十二:Callable 和 Runnable 的不同?
  6. Java同构渲染,从零开始构建react应用(五)同构之服务端渲染
  7. TestNG+Maven+IDEA 自动化测试(一) 环境搭建
  8. avalon源码分析(转)
  9. 显示用户上次访问时间
  10. java乱码解决方法