工厂方法模式【Python篇】

2023-05-16

前言


在《设计模式》一书中工厂模式提到了:

  • 工厂方法模式(Factory Method)
  • 抽象工厂模式 (Abstract Factory)


但是在实际过程中还有一种工厂模式经常被使用,那就是 简单工厂模式(Simple Factory)。有一种常见的分类的方法:根据产品是由具体产品还是具体工厂可以分为 工厂方法模式简单工厂模式;根据工厂的抽象程度可以分为 工厂方法模式抽象工厂模式。接下来会通过例子对比简单工厂模式和工厂方法模式。

工厂意图


定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

别名

虚构造器(Virtual Constructor)

案例

第一阶段

小李开了一个代工厂,专门帮各大厂商生产手机,一开始只有小米找他生产小米手机(MiPhone),后来质量过硬,声名远播,苹果公司也找上门了,准备让他生产苹果手机,生意来了,小李小手一挥,停工几个月,加了一个生产线专门生成苹果手机(Iphone)。于是乎,现在一个工厂有两个生产线。

第一阶段 UML 图

让我们借助 UML 图直观了解一下工厂现在的样子。
在这里插入图片描述

第一阶段代码

通过代码去实现这个逻辑

from abc import ABC, abstractmethod

# 生产线
class ProductLine(ABC):
    
    @abstractmethod
    def make(self):
        pass

# 苹果生产线
class Apple(ProductLine):
    
    def make(self):
        print("make apple")

# 小米生产线
class XiaoMi(ProductLine):
    
    def make(self):
        print("make xiaomi")


class Factory:

    def product_phone(self, mobile_type):
        if mobile_type == 'apple':
            return Apple()
        else:
            return XiaoMi()


if __name__ == '__main__':
    factory = Factory()
    factory.product_phone('apple').make()
    factory.product_phone('xiaomi').make()

看一下运行结果:

make apple
make xiaomi

第二阶段

随着第一阶段的订单完成,现在越来越多的手机厂商来找小李来生产手机,问题来了,生产线改造需要导致整个工厂停工一段时间,每次停工对工厂来说都是巨大的损失。那么该怎么解决问题呢?一个工厂似乎不够用了,那么该怎么解决呢? 把所有的生产线独立出来到单独的工厂,这样子需要生产新的手机只需要新增新的工厂就好了,不会影响其他的手机的生产。

第二阶段 UML 图

同样让我们借助 UML 图了解一下这个阶段工厂的样子吧。
在这里插入图片描述

第二阶段代码

同样让我们借助代码去实现这一阶段的逻辑

from abc import ABC, abstractmethod

# 抽象工厂
class AbastractFactory(ABC):
    
    @abstractmethod
    def product_phone(self):
        pass

# 苹果工厂
class AppleFactory(AbastractFactory):
    
    def product_phone(self):
        return Apple().make()

# 小米工厂
class XiaomiFactory(AbastractFactory):
    
    def product_phone(self):
        return XiaoMi().make()
 

# 生产线
class ProductLine(ABC):
   	
    @abstractmethod
    def make(self):
        pass

# 苹果生产线
class Apple(ProductLine):
    
    def make(self):
        print("make apple")

# 小米生产线
class XiaoMi(ProductLine):
    
    def make(self):
        print("make xiaomi")

def client_product(factory:AbastractFactory):
    return factory

if __name__ == '__main__':
    xiaomi = client_product(XiaomiFactory())
    xiaomi.product_phone()
    apple = client_product(AppleFactory())
    apple.product_phone()

看一下运行结果:

make xiaomi
make apple

总结

上面的案例中的俩个阶段分别对应了两个设计模式,分别是:**简单工厂模式 **和 工厂方法模式。通过案例和对比,我们不难发现它们的的优缺点。

简单工厂模式优缺点

  • 优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。
  • 缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则

工厂方法模式优缺点

  • 优点:更符合开闭原则,增加一个产品类,则只需要实现其他具体的产品类和具体的工厂类即可;符合单一职责原则,每个工厂只负责生产对应的产品
  • 缺点:增加一个产品,就需要实现对应的具体工厂类和具体产品类;每个产品需要有对应的具体工厂和具体产品类

参考

简单工厂模式、工厂方法模式与抽象工厂模式总结
Factory: Encapsulating Object Creation
设计模式之工厂模式(factory pattern)

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

工厂方法模式【Python篇】 的相关文章

  • Matlab:使用 Filtered-x LMS FIR 自适应滤波器实现有源噪声控制

    Matlab xff1a 使用 Filtered x LMS FIR 自适应滤波器实现有源噪声控制 一 有源噪声控制 Active Noise Control 二 次级传播路径的实现代码 Secondary Propagation Path
  • Matlab:多输入多输出非线性对象的模型预测控制(MPC, Model Predictive Control)的实现

    Matlab xff1a 多输入多输出非线性对象的模型预测控制的实现 一 非线性对象的线性化1 1 线性化过程1 2 I O变量分配名称 二 设计模型预测控制 MPC Model Predictive Control 控制器三 使用Simu
  • pyspider的使用

    原文地址 如有违权请告知删除 pyspider 是一个用python实现的功能强大的网络爬虫系统 xff0c 能在浏览器界面上进行脚本的编写 xff0c 功能的调度和爬取结果的实时查看 xff0c 后端使用常用的数据库进行爬取结果的存储 x
  • C++标准 — C++17特性 — 文件系统 — path 路径处理

    C 43 43 标准 C 43 43 17特性 文件系统 path 路径处理 一 分解二 查询三 拼接1 append 61 2 concat 43 61 四 修改五 遍历六 比较 类型 path 的对象表示文件系统上的路径 只有路径的语法
  • python编程语言创始人-Python编程语言的实现内幕的相关介绍

    以下的文章是对Python编程语言的 34 实现内幕 做一介绍 xff0c 大家很熟悉的有可能是Python的发展历史 xff0c 也有可能是Python编程语言的实际应用中具有强大的功能 xff0c 下面是文章的主要描述 xff0c 希望
  • python怎么安装包-如何给自己的Python项目制作安装包

    本教程将指导您如何打包一个简单的Python项目 它将向您展示如何添加必要的文件和结构来创建包 xff0c 如何构建包以及如何将其上载到Python包索引 A simple project 本教程使用名为example pkg的简单项目 如
  • python app教程-Python zipapp打包教程(超级详细)

    经过复杂的开发 调试之后 xff0c 终于得到一个 Python 程序 xff0c 这个程序或许精巧 xff0c 或许有些古拙 xff0c 但它是我们心血的结晶 xff0c 我们当然希望将这个程序发布出来 Python 提供了一个 zipa
  • python 文字语音朗读-怎么用 Python 来朗读网页 ?

    是不是有的时候懒得自己看新闻 xff1f 那么不妨试试用 Python 来朗读给你听吧 网页转换成语音 xff0c 步骤无外乎 xff1a 网页正文识别 xff0c 获取到正文的文本内容 xff1b 文本转语音 xff0c 通过接口将文本转
  • python 填充折线图下部区域

    整理一下 xff0c 运行图 xff1a 全部代码为 xff1a from pylab span class token function import span matplotlib rcParams span class token p
  • python语音在线编辑-Python:语音处理,实现在线朗读RFC文档或本地文本文件

    本文主要讲解如何使用python来实现将文本转为语音 xff0c 以一个小例子为例 xff0c 写了一下用pyTTS来朗读本地方件或在线朗读RFC文档 xff0c 当然也可以修改一下 xff0c 做成在线朗读新闻之类的 xff0c 另本来想
  • python画函数图像-python实现画出e指数函数的图像

    这里用Python逼近函数y 61 exp x 同样使用泰勒函数去逼近 exp x 61 1 43 x 43 x 2 2 43 43 x n n 43 usr bin python coding utf 8 import numpy as
  • python使用方法视频-使用Python进行视频处理

    Imageio逐帧视频处理 安装 conda install imageio 将视频转换成图片 import imageio timeF 61 10 reader 61 imageio get reader 39 imageio cocka
  • python认证证书有哪些-python考试认证

    广告关闭 腾讯云双11爆品提前享 xff0c 精选热门产品助力上云 xff0c 云服务器首年88元起 xff0c 买的越多返的越多 xff0c 最高满返5000元 xff01 除了之前热议的加入高考和中小学教育之外 xff0c 现在连普通大
  • python代码写完怎么运行-Python 项目代码写完了,然后怎么打包和发布?

    你把你的代码写完了 xff0c 是不是要给别人使用下 xff0c 怎么打包你的项目代码呢 喂 xff0c 开源么 接下来小帅b就跟你说说 xff0c 如何打包你的代码 就拿我们上次演示的 用 Python 开发一个 个人计划 todolis
  • Zoom to Learn, Learn to Zoom

    Abstract 本文表明 xff0c 将机器学习应用于数字变焦时 xff0c 对真实 原始的传感器数据进行操作是有益的 现有的基于学习的超分辨率方法不使用真实的传感器数据 xff0c 而是对经过处理的RGB图像进行操作 我们表明 xff0
  • 6个非常实用的 Python 代码块,适合收藏~

    大家好 xff0c 今天分享几个平时我会用到的 Python 代码块 xff0c 每个都小而精 xff0c 喜欢记得关注 点赞 收藏 1 xff0c 批量修改文件名 日常工作中 xff0c 可能会有这样的需求 xff1a 把一个文件夹下所有
  • 1.音视频播放原理介绍

    音视频技术主要包含以下几种 xff1a 封装技术 xff0c 视频压缩技术 xff0c 音频压缩技术 xff0c 流媒体协议技术以及防盗链技术 接下来的几篇文章将对这几种技术做深入的研究和实践 下面简单说明一下视频播放的原理 xff08 以
  • 码云仓库建库

    方法一 xff1a 先将在码云上新建的仓库clone到本地 xff0c 修改后再push到码云仓库 git clone https gitee com 用户个性地址 工程名字 git 将远程仓库克隆到本地 在克隆过程中 xff0c 如果仓库
  • Python 画多图 统计直方图

    画直方图的命令是这个 xff1a 把里面的内容改了就可以 ec参数调整的是edgecolor xff0c 即框线颜色 matplotlib pyplot hist span class token punctuation span x sp
  • 输入2个整数,求最大公约数和最小公倍数

    输入2个整数 xff0c 求最大公约数和最小公倍数 关于最大公约数的算法 xff0c 古希腊数学家欧几里得已经在2200年前给出我们算法公式 xff0c 我们直接拿来用就可以了 欧几里得算法也被称为辗转相除法 xff0c 用来求最大公约数

随机推荐

  • WSL2 安装 图形系统 及遇到的坑

    wsl本身不带有图形界面 xff0c 需要自己安装 安装流程如下 xff1a 一 windows环境安装VcXsrv 默认安装即可 二 Ubuntu环境安装 xfce4 sudo apt get install xfce4 三 Ubuntu
  • 【美团】项目学习1:登录逻辑实现

    rest framework 和app应用 INSTALLED APPS span class token operator span span class token punctuation span span class token s
  • KMP算法

    一 何谓模式串匹配 模式串匹配 xff0c 就是给定一个需要处理的文本串 xff08 理论上应该很长 xff09 和一个需要在文本串中搜索的模式串 xff08 理论上长度应该远小于文本串 xff09 xff0c 查询在该文本串中 xff0c
  • webApi不能使用put和delete请求的处理方式

    今天调试webApi接口的时候 xff0c 分别使用get post put delete方式都试一下 xff0c 发现get和post方式都能正常调用 xff0c 但是使用put和delete的时候就报错了 xff0c 如下图所示 xff
  • Git 中 6 个基本常用命令

    大家好啊 xff0c 我是大田 想更深刻了解 Git 常用命令 xff0c 先来看看原理图 xff1a 我们使用 Git 操作的核心步骤就是 xff1a 先add代码到git缓存 然后commit到git本地仓库 最后push到远程Gith
  • Ubutun 使用easy-rsa 自签证书

    sudo apt install easy rsa mkdir root cert easy rsa ln s usr share easy rsa easy rsa cd root cert easy rsa easyrsa init p
  • Ubuntu ARM环境安装

    基础环境 防火墙 jiangzz 64 ubuntu span class token function sudo span ufw status Status inactive jiangzz 64 ubuntu span class t
  • 关系代数练习

    设有三个关系 xff1a S S SNAME AGE SEX SC S C GRADE C C xff0c CNAME xff0c TEACHER 试用关系代数表达式表示下列查询语句 xff1a 1 检索LIU老师所授课程的课程号和课程名
  • 使用Opencv调用摄像头失败的解决办法

    这几天参考 OpenCV3编程入门 书中的 调用摄像头采集图像的代码进行编程 xff0c 可是代码照着书上的打完了 xff0c 进行编译的时候竟然报错了 xff0c 于是乎就在网上查找错误的解决办法 xff0c 一开始是以为自己的驱动没装好
  • java日记(一)理解代码片段

    最近跟着Berkeley的CS61B学java 跨专业小白一个学起来比较吃力 xff0c 还好有大佬带着 决定开个贴子整理一下 代码片段是 xff1a DO NOT MODIFY ANYTHING ABOVE THIS LINE span
  • IOS - ReplayKit2 获取影像方向+ReplayKit的坑

    插件对象 64 interface SampleHandler RPBroadcastSampleHandler 重写方法 void processSampleBuffer CMSampleBufferRef sampleBuffer wi
  • Sublime Text运行C和C++程序

    原文链接 xff1a Sublime Text运行C和C 43 43 程序 Sublime Text 是一款当下非常流行的文本编辑器 xff0c 其功能强大 xff08 提供有众多的插件 xff09 界面简洁 还支持跨平台使用 xff08
  • VTK——自定义三维裁剪Widget,恢复Widget(任意形状,圆形,矩形裁剪)vtkCustomPaintWidget

    裁剪图标可以通过键盘上下键切换 xff0c 裁剪模式可以通过键盘左右键切换 xff0c 裁剪区域的显示 xff0c 可以显示为Mask或者显示为Contour边界 xff0c 测试效果如下
  • iOS UITableViewCell高度自适应

    UITableViewCell高度自适应 iOS8之后 我们只需要设置这两句代码之后 xff0c 即可放心的往cell的控件里面加上内容 xff0c cell会根据内部所有控件的高度动态的计算自己的高度从而显示出来 tableView es
  • 记一次vncServer的离线安装经历

    记一次vncServer的离线安装经历 背景 xff1a 需要在一台服务器上面装Oracle xff0c 但是服务器并不能接触到 xff0c 所以只能在客户端进行远程ssh操作 首先根据我以往装Oracle的经验 xff0c 先把安装包这些
  • debian 修改桌面背景

    64 桌面背景 push 图片到对应目录替换 xff1a adb push 图片 usr share desktop base active theme wallpaper contents images 64 当前语言查看 cat etc
  • 【计算机图形学基础教程】MFC基本绘图函数2

    MFC基本绘图函数 绘图工具类 CGdiObject类 xff1a GDI绘图工具的基类CBitmap类 xff1a 封装了GDI画刷 xff0c 可以选作设备上下文的当前画刷 xff0c 用于填充图形的内部CFont类 xff1a 封装了
  • thrift安装及示例

    1 简介 Apache Thrift软件框架 xff08 用于可扩展的跨语言服务开发 xff09 将软件堆栈与代码生成引擎结合在一起 xff0c 它有自己的跨机器的通信框架 xff0c 并提供一套库 它是一个代码生成器 xff0c 按照它的
  • you-get库二开,带UI界面的下载器

    you get库二开 带UI界面的下载器 span class token comment coding utf 8 span span class token comment Form implementation generated f
  • 工厂方法模式【Python篇】

    前言 在 设计模式 一书中工厂模式提到了 xff1a 工厂方法模式 xff08 Factory Method xff09 抽象工厂模式 xff08 Abstract Factory xff09 但是在实际过程中还有一种工厂模式经常被使用 x