Python设计模式 - 工厂方法模式

定义

工厂方法模式是一种创建型设计模式,它定义一个创建对象的接口,让其子类来处理对象的创建,而不是直接实例化对象。

结构

在这里插入图片描述
抽象工厂(Factory):声明工厂方法,返回一个产品对象。具体工厂类都必须实现该方法。
具体工厂(Concrete Factory):实现工厂方法以创建具体的产品对象。
抽象产品(Product):定义产品对象的接口。
具体产品(Concrete Product):实现产品接口的具体产品对象。

应用场景

  1. 产品类型繁多且结构相似:当产品类型较多且具有相似的结构时,可以使用工厂方法模式来管理创建逻辑。抽象工厂类定义抽象方法,具体工厂类实现抽象方法创建具体的产品对象,从而简化客户端代码。例如不同类型的日志记录器、不同类型的报表生成器等。
  2. 处理复杂创建过程:当对象的创建过程比较复杂,需要很多步骤或依赖其他对象。工厂方法模式可以将这些复杂的创建过程封装在工厂方法中,从而简化客户端代码,并确保对象创建的一致性。例如,不同类型的数据库连接、复杂的对象初始化流程等。
  3. 系统需要良好的扩展性:当系统需要能够方便地引入新的产品对象时,可以使用工厂方法模式。通过新增具体工厂类并实现工厂方法,可以在不修改现有代码的情况下扩展系统的功能。

优缺点

优点:

  1. 简化客户端代码:客户端代码不需要了解具体产品类的创建细节,只需调用工厂类的创建方法即可获得所需的对象。这减少了客户端代码的复杂性,使其更容易维护和理解。
  2. 提高代码的可维护性:工厂方法模式将复杂的对象创建过程封装在工厂方法中,客户端代码不需要关心对象的创建细节,从而简化了代码的维护。
  3. 符合开闭原则:工厂方法模式符合面向对象设计中的开闭原则,即对扩展开放,对修改关闭。新增产品类时,无需修改现有的工厂类,只要新增具体工厂类即可。

缺点:

  1. 增加代码复杂性:工厂方法模式引入了额外的类和接口,这可能会增加代码的复杂性,也会增加运行时资源的开销,尤其是在产品类和工厂类数量较多的情况下。

代码示例

from abc import ABC, abstractmethod# 抽象产品类
class Vehicle(ABC):@abstractmethoddef drive(self) -> str:pass# 具体产品类 - 汽车
class Car(Vehicle):def drive(self) -> str:return "Driving a car"# 具体产品类 - 自行车
class Bicycle(Vehicle):def drive(self) -> str:return "Riding a bicycle"# 抽象工厂类
class VehicleFactory(ABC):@abstractmethoddef create_vehicle(self) -> Vehicle:pass# 具体工厂类 - 汽车工厂
class CarFactory(VehicleFactory):def create_vehicle(self) -> Vehicle:return Car()# 具体工厂类 - 自行车工厂
class BicycleFactory(VehicleFactory):def create_vehicle(self) -> Vehicle:return Bicycle()# 客户端代码
def client_code(factory: VehicleFactory) -> None:vehicle = factory.create_vehicle()print(f"Client: {vehicle.drive()}")if __name__ == "__main__":print("App: Using the CarFactory.")client_code(CarFactory())print("\n")print("App: Using the BicycleFactory.")client_code(BicycleFactory())

工厂方法模式和简单工厂模式的比较

工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,同时也弥补了简单工厂模式的不足。它针对不同的产品提供不同的工厂,可以很好地解决简单工厂模式的以下两个问题:

  1. 违反开闭原则:每当需要添加新的产品类型时,都必须修改工厂类以添加新的创建逻辑,违反了开闭原则。
  2. 可能包含大量的条件判断:工厂类中的条件判断语句会随着产品种类的增加而变得冗长且复杂。

工厂方法模式和简单工厂模式适用于不同的场景:

  1. 简单工厂模式的灵活性和扩展性较低,适用于产品种类相对固定且变化不频繁的场景。工厂方法模式适用于产品种类较多且经常变化的场景,尤其需要在不修改现有代码的情况下添加新产品时。
  2. 简单工厂模式的实现和使用都较简单,适合小型系统或简单场景。工厂方法模式的实现和使用都较复杂,适合大型系统或复杂场景。

参考

《设计模式的艺术》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386038.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git等常用工具以及cmake

一、将git中的代码克隆进电脑以及常用工具介绍 1.安装git 首先需要安装git sudo apt install git 注意一定要加--recursive,因为文件中有很多“引用文件“,即第三方文件(库),加入该选项会将文件中包含的子模…

区块链技术如何重塑医疗健康行业未来?

区块链在医疗领域的应用日益广泛,主要体现在以下几个方面: 一、医疗数据管理 电子病历管理: 区块链技术可以用于构建去中心化的电子病历系统,确保病历数据的不可篡改性和安全性。患者可以通过区块链平台安全地管理自己的电子病历…

30岁决心转行,AI太香了

今天是一篇老学员的经历分享,此时的王同学在大洋彼岸即将毕业,手握多家北美大厂offer,一片明媚。谁能想到王同学的转码之路竟始于一场裁员,这场访谈拉开了他的回忆。 最近总刷到一些关于转行的话题,很多刚毕业的同学喜…

【OpenCV C++20 学习笔记】图片融合

图片融合 原理实现结果展示完整代码 原理 关于OpenCV的配置和基础用法,请参阅本专栏的其他文章:垚武田的OpenCV合集 这里采用的图片熔合的算法来自Richard Szeliski的书《Computer Vision: Algorithms and Applications》(《计算机视觉&#…

极简Springboot+Mybatis-Plus+Vue零基础萌新都看得懂的分页查询(富含前后端项目案例)

目录 springboot配置相关 依赖配置 yaml配置 MySQL创建与使用 (可拿软件包项目系统) 创建数据库 创建数据表 mybatis-plus相关 Mapper配置 ​编辑 启动类放MapperScan 启动类中配置 添加config配置文件 Springboot编码 实体类 mapperc(Dao…

LINUX -exec函数族

1、功能: *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序,不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序: *指定执行目录下的程序 int execl(const char *path,…

工业三防平板,高效能与轻便性的结合

在当今数字化、智能化的工业时代,工业三防平板作为一种创新的设备,正以其独特的优势在各个领域发挥着重要作用。它不仅具备高效能的处理能力,还拥有出色的轻便性,为工业生产和管理带来了前所未有的便利。 一、高效能的核心动力 工…

Python爬虫-中国汽车市场月销量数据

前言 本文是该专栏的第34篇,后面会持续分享python爬虫干货知识,记得关注。 在本文中,笔者将通过某汽车平台,来采集“中国汽车市场”的月销量数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废话不多说,下面跟着笔者直接往下看正文详细内容。(附…

GroupMamba实战:使用GroupMamba实现图像分类任务(一)

摘要 状态空间模型(SSM)的最新进展展示了在具有次二次复杂性的长距离依赖建模中的有效性能。GroupMamba解决了将基于SSM的模型扩展到计算机视觉领域的挑战,特别是大型模型尺寸的不稳定性和低效性。GroupMamba在ImageNet-1K的图像分类、MS-CO…

DC-DC 反激式电路的共模噪声分析

本系列文章的第 5 和第 6 部分[1-7]介绍有助于抑制非隔离 DC-DC 稳压器电路传导和辐射电磁干扰 (EMI) 的实用指南和示例。当然,如果不考虑电隔离设计,DC-DC 电源 EMI 的任何处理方式都不全面,因为在这些电路中,电源变压器的 EMI 性…

Python常用内置库介绍

Python作为一门强大且易学的编程语言,内置了许多功能强大的库,让开发者能够更加便捷地完成各种任务。本文中,我将详细介绍Python中常用的内置库。 math:提供数学函数,如三角函数、对数函数等。 示例:计算平…

web后端--Spring事务管理

事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下,只有出现RunTimeException才会回滚事务,rollbackfor属性用于控制出现何种异常类型,回滚…

Golang | Leetcode Golang题解之第292题Nim游戏

题目: 题解: func canWinNim(n int) bool {return n%4 ! 0 }

前端开发调试工具推荐分类整理

具体前往:前端调试工具分类整理汇总

创维汽车滁州永通体验中心开业仪式暨超充车型区域上市会圆满成功

2024年7月20日,创维汽车滁州永通体验中心盛大开业,当日,创维汽车市场部经理周世鹏、安徽大区总监王大明等领导参加本次开业盛典,共同见证创维汽车滁州永通体验中心成功落地。 2021年,新能源乘用车高速发展,…

Yak Runner 新版本,City不City?

现在直接打开Yak Runner,在最中间的位置将会有三个选项以供选择,分别是新建文件、打开文件和打开文件夹。新建文件允许你快速的打开一个临时文件,以便你快速开发一个小脚本或者是使用某些你急需使用到的函数(你知道的,…

引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。

vue3 报错: 引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。 解决: 进入对应的 json 文件: 修改: "noEmit": false 当 noEmit 设置为 false 时,TypeScript 编译器将根据项目配置生成相应的输出文…

Jvm基础(一)

目录 JVM是什么运行时数据区域线程私有1.程序计数器2.虚拟机栈3.本地方法栈 线程共享1.方法区2.堆 二、对象创建1.给对象分配空间(1)指针碰撞(2)空闲列表 2.对象的内存布局对象的组成Mark Word类型指针实例数据:对齐填充 对象的访问定位句柄法 三、垃圾收集器和内存…

瑞芯微平台RK3568系统开发(2)Camera 开发1

1. 前言 1.1 RK3568硬件框图 1.2 开发流程 通过gstreamer/rockit来在rockchip平台上做multimedia的开发: vpu_service--> mpp --> gstreamer/ffmpeg --> app vpu_service:驱动 mpp:rockchip平台的视频编解码中间件,相关说明参考…

vue3+ts+vite+electron+electron-packager打包成exe文件

目录 1、创建vite项目 2、添加需求文件 3、根据package.json文件安装依赖 4、打包 5、electron命令运行 6、electron-packager打包成exe文件 Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron 1、创建vite项目 npm create vitelatest 2、添…