【Python设计模式07】工厂方法模式

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。通过使用工厂方法模式,可以将对象的创建过程与使用过程分离,从而提高代码的灵活性和可扩展性。

工厂方法模式的结构

工厂方法模式主要包括以下几个角色:

  1. 抽象产品(Product):定义产品的接口。
  2. 具体产品(ConcreteProduct):实现抽象产品接口的具体产品类。
  3. 抽象工厂(Creator):声明工厂方法,用于返回一个产品对象。可以定义一个工厂方法的默认实现。
  4. 具体工厂(ConcreteCreator):实现抽象工厂接口,重定义工厂方法以返回一个具体产品实例。

示例

假设我们有一个日志系统,可以记录日志到控制台或文件。我们可以使用工厂方法模式来实现不同日志记录方式的选择和创建。

定义抽象产品和具体产品
from abc import ABC, abstractmethodclass Logger(ABC):@abstractmethoddef log(self, message: str):passclass ConsoleLogger(Logger):def log(self, message: str):print(f"Console: {message}")class FileLogger(Logger):def __init__(self, filename: str):self.filename = filenamedef log(self, message: str):with open(self.filename, 'a') as f:f.write(f"File: {message}\n")
定义抽象工厂和具体工厂
class LoggerFactory(ABC):@abstractmethoddef create_logger(self) -> Logger:passclass ConsoleLoggerFactory(LoggerFactory):def create_logger(self) -> Logger:return ConsoleLogger()class FileLoggerFactory(LoggerFactory):def __init__(self, filename: str):self.filename = filenamedef create_logger(self) -> Logger:return FileLogger(self.filename)
使用工厂方法模式
def main():# 创建控制台日志记录器console_factory = ConsoleLoggerFactory()console_logger = console_factory.create_logger()console_logger.log("This is a console log message.")# 创建文件日志记录器file_factory = FileLoggerFactory("app.log")file_logger = file_factory.create_logger()file_logger.log("This is a file log message.")if __name__ == "__main__":main()

在这个示例中,Logger是抽象产品,ConsoleLoggerFileLogger是具体产品。LoggerFactory是抽象工厂,ConsoleLoggerFactoryFileLoggerFactory是具体工厂。通过工厂方法模式,我们可以灵活地选择和创建不同类型的日志记录器,而不需要修改客户端代码。

工厂方法模式的优缺点

优点
  1. 遵循开闭原则:可以在不修改现有代码的情况下增加新产品。
  2. 提高灵活性:可以根据需要在运行时选择和创建具体的产品。
  3. 封装对象创建过程:将对象的创建过程封装在工厂类中,减少了客户端代码的复杂性。
缺点
  1. 增加代码复杂性:引入更多的类和接口,增加了代码的复杂性。
  2. 难以管理:当产品种类增多时,可能会导致工厂类的数量增加,管理起来较为困难。

工厂方法模式的适用场景

  1. 创建对象需要较复杂的过程:对象的创建过程较为复杂,包含多个步骤或涉及多个依赖时,可以使用工厂方法模式。
  2. 需要灵活地创建不同类型的对象:根据不同的条件或环境,在运行时选择和创建不同类型的对象。
  3. 遵循开闭原则:需要在不修改现有代码的情况下增加新产品。

工厂方法模式与简单工厂模式的区别

  • 简单工厂模式:由一个工厂类负责创建所有产品,工厂类通常包含一个静态方法,根据传入的参数来创建具体产品。简单工厂模式不符合开闭原则。
  • 工厂方法模式:将对象创建的职责分散到多个具体工厂类中,每个具体工厂类负责创建一种具体产品。工厂方法模式符合开闭原则。

总结

工厂方法模式是一种创建型设计模式,通过定义一个用于创建对象的接口,将对象的创建过程延迟到子类,从而提高代码的灵活性和可扩展性。通过使用工厂方法模式,可以在不修改现有代码的情况下增加新产品,减少了代码耦合,提高了系统的可维护性。合理应用工厂方法模式,可以显著提升代码质量和设计水平。

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

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

相关文章

微软:最新ChatGPT-4o模型,可在 Azure OpenAI上使用

北京时间5月14日凌晨,OpenAI 一场不到 30 分钟的发布会,正式发布了 GPT-4o,视频语音交互丝滑到吓人,还即将免费可用! GPT-4o,其中的「o」代表「omni」(即全面、全能的意思)&#xff…

如何通过locust进行全链路压测

通过Locust进行全链路压测的具体步骤 Locust是一个开源的性能测试工具,支持分布式压测和高并发测试。它基于Python编写,使用方便且功能强大。本文将详细介绍如何使用Locust进行全链路压测,包括准备工作、测试脚本编写、压测执行和结果分析等…

BIO从提交到执行完毕过程分析

1.上层调用submit_bio()向块设备层提交IO请求,q->make_request_fn()=>__make_request()被调用,将BIO合并到已有的request或为BIO新分配一个request. 2.调用elv_merge(),首先尝试是否可以和上一次合并的request进行合并,如果不能合并,调用IO调度器提供的合并函数,尝试与I…

AIGC行业:巨头引领的创新浪潮与市场前景

AIGC(AI Generated Content)技术,作为新兴的技术力量,正逐渐改变内容创作的生态。在这一变革中,国内科技巨头如百度、阿里巴巴、腾讯等的积极参与,不仅为行业带来资本和技术支持,更预示着AIGC技…

react 下拉框内容回显

需要实现效果如下 目前效果如下 思路 : 将下拉框选项的value和label一起存储到state中 , 初始化表单数据时 , 将faqType对应的label查找出来并设置到Form.Item中 , 最后修改useEffect 旧代码 //可以拿到faqType为0 但是却没有回显出下拉框的内容 我需要faqType为0 回显出下拉…

Shell脚本基本命令

文件名后缀.sh 编写shell脚本一定要说明一下在#!/bin/bash在进行编写。命令选项空格隔开。Shell脚本是解释的语言,bash 文件名即可打印出编写的脚本。chmod给权限命令。如 chmod 0777 文件名意思是给最高权限。 注意:count赋值不能加空格。取消变量可在变…

如何提升网络性能监控和流量回溯分析的效率?

目录 什么是网络性能监控? 网络性能监控的关键指标 什么是流量回溯分析? 流量回溯分析的应用场景 网络性能监控与流量回溯分析的结合 实例应用:AnaTraf网络流量分析仪 如何选择适合的网络性能监控和流量回溯分析工具? 结论…

MQTT 5.0 报文解析 06:AUTH

欢迎阅读 MQTT 5.0 报文系列 的最后一篇文章。在上一篇中,我们已经介绍了 MQTT 5.0 的 DISCONNECT 报文。现在,我们将介绍 MQTT 中的最后一个控制报文:AUTH。 MQTT 5.0 引入了增强认证特性,它使 MQTT 除了简单密码认证和 Token 认…

Vue3实战笔记(36)—粒子特效完成炫酷的404

文章目录 前言404特效总结 前言 昨天介绍了一个粒子特效小例子&#xff0c;不够直观&#xff0c;下面直接实战在自己的项目中实现一个好玩滴。 404特效 更改之前创建好的404.vue: <template><div class"container"><vue-particles id"tspartic…

阿里云和AWS的CDN产品对比分析

在现代互联网时代,内容分发网络(CDN)已成为确保网站和应用程序高性能和可用性的关键基础设施。作为两家领先的云服务提供商,阿里云和Amazon Web Services(AWS)都提供了成熟的CDN解决方案,帮助企业优化网络传输和提升用户体验。我们九河云一直致力于阿里云和AWS云相关业务&#…

【光伏干货】光伏无人机巡检步骤

随着光伏产业的迅速发展和无人机技术的日益成熟&#xff0c;光伏无人机巡检已成为提高光伏电站运维效率、降低运维成本的重要手段。本文将详细介绍光伏无人机巡检的步骤&#xff0c;帮助读者更好地理解和应用这一技术。 一、前期准备 1、设备检查&#xff1a;对无人机及其相关…

mysql内存和磁盘的关系

mysql内存和磁盘的关系 1.MySQL的内存和磁盘之间的关系是密切的。MySQL的数据存储在磁盘上&#xff0c;但为了高效地执行查询操作&#xff0c;它也会将数据页&#xff08;每个页通常为16KB&#xff09;读入内存。MySQL的缓冲池&#xff08;buffer pool&#xff09;是在内存中的…

谷歌插件编写

目录 manifest.json {"manifest_version": 3,"name": "Floating Ball","version": "1.0","description": "A floating ball on the right side of the webpage.","permissions": ["act…

【算法】位运算算法——两整数之和

题解&#xff1a;两整数之和(位运算算法) 目录 1.题目2.位运算算法3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.位运算算法 这个题目难点就在于不能用、- 那什么能够代替加号呢&#xff1f; 既然数的层面不能用号&#xff0c;那二进制的角度去用号即可。 恰好&a…

MySQL 数据类型和搜索引擎

文章目录 【 1. 数据类型 】1.1 数值类型1.1.1 整型1.1.2 小数1.1.3 数值类型的选择 1.2 日期和时间YEAR 年TIME 时间DATE 日期DATETIME 日期时间TIMESTAMP 时间戳日期和时间的选择 1.3 文本字符串CHAR 固定字符串、VARCHAR 可变字符串TEXT 文本ENUM 枚举SET 集合字符串类型的选…

假如有几十个请求,如何去控制高并发?

公司项目中做图片或文件批量下载&#xff0c;每次下载都是大批量的&#xff0c;那么假如我一次性下载几十个&#xff0c;如何去控制并发请求的&#xff1f; 让我想想&#xff0c;额~&#xff0c; 选中ID&#xff0c;循环请求&#xff1f;&#xff0c;八嘎&#xff01;肯定不是那…

MySQL中Undo-log是什么?有什么作用?

2.6.1. Undo-log撤销日志 Undo即撤销的意思&#xff0c;通常也称为回滚日志&#xff0c;用来给MySQL撤销SQL操作的。 当一条写入类型的SQL执行时&#xff0c;都会记录Undo-log日志&#xff0c;Undo-log并不存在单独的日志文件&#xff0c;InnoDB默认是将Undo-log存储在xx.ibd…

利用基于CNN的人员检测与关键词识别的TinyML实现无接触电梯

目录 说明 论文概述 摘要 引言 现有非接触式电梯解决方案 新解决方案的需求 tinyML实施 系统构建和算法管道 CNN和TinyML实现 结果与讨论 结论 视频演示和代码可用性 一点感想 说明 我一直使用Google Schloar订阅最新的论文消息&#xff0c;今天看到一篇论文的标…

MR混合现实情景实训教学系统在临床医学课堂上的应用

MR混合现实情景实训教学系统在临床医学课堂上的应用可以带来许多积极的影响&#xff0c;具体表现在以下几个方面&#xff1a; 1. 增强教学的真实感和互动性&#xff1a;MR混合现实技术能够创建出高度逼真的模拟临床环境&#xff0c;使学生能够身临其境地体验临床实践。这种技术…

word快速公式教程

好文章分享 word快捷输入数学公式、word公式最详细介绍&#xff01;释放鼠标、代码大全&#xff01;&#xff01;&#xff01;&#xff08;小白也能学&#xff09; - 知乎