设计模式——工厂方法模式

文章目录

      • 工厂方法模式简介
      • 工厂方法模式的组成部分
      • 工厂方法模式的结构
      • Factory和Method的含义
      • 工厂方法模式的应用场景
      • 工厂方法模式的示例
        • 1. 文档生成器
        • 2. 数据库连接

工厂方法模式简介

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让一个类的实例化延迟到其子类。

工厂方法模式的组成部分

  1. 产品(Product):定义工厂方法所创建对象的接口。
  2. 具体产品(ConcreteProduct):实现产品接口的具体类。
  3. 创建者(Creator):声明工厂方法,该方法返回一个产品类型的对象。创建者的子类通常会提供这个工厂方法的实现。
  4. 具体创建者(ConcreteCreator):实现工厂方法,返回具体产品实例。

工厂方法模式的结构

from abc import ABC, abstractmethod# 产品接口
class Product(ABC):@abstractmethoddef use(self):pass# 具体产品
class ConcreteProductA(Product):def use(self):return "Using Product A"class ConcreteProductB(Product):def use(self):return "Using Product B"# 创建者
class Creator(ABC):@abstractmethoddef factory_method(self) -> Product:passdef some_operation(self) -> str:product = self.factory_method()result = f"Creator: The same creator's code has just worked with {product.use()}"return result# 具体创建者
class ConcreteCreatorA(Creator):def factory_method(self) -> Product:return ConcreteProductA()class ConcreteCreatorB(Creator):def factory_method(self) -> Product:return ConcreteProductB()# 使用工厂方法
def client_code(creator: Creator) -> None:print(f"Client: I'm not aware of the creator's class, but it still works.\n{creator.some_operation()}")print("App: Launched with ConcreteCreatorA.")
client_code(ConcreteCreatorA())print("\nApp: Launched with ConcreteCreatorB.")
client_code(ConcreteCreatorB())

Factory和Method的含义

  • Factory(工厂):在工厂方法模式中,"工厂"指的是负责创建对象的角色。具体来说,工厂是一个方法,它提供对象的创建逻辑。这个方法由抽象创建者声明,具体创建者实现。

  • Method(方法):工厂方法是一个方法(函数),这个方法的职责是创建并返回一个产品对象的实例。工厂方法模式中的"方法"强调的是通过这个方法来进行对象的创建,而不是直接调用构造函数。

工厂方法模式的应用场景

  1. 需要生成不同类型的对象:当系统需要生成不同类型或不同配置的对象时,可以使用工厂方法模式来实现对象的创建。
  2. 客户端不需要知道所创建对象的具体类:客户端通过工厂方法来获取对象的实例,而不需要知道具体的实现类。
  3. 系统的产品类较为复杂且易变:当产品类的创建逻辑复杂或容易发生变化时,工厂方法模式可以将创建逻辑封装在子类中,使得主类代码简洁且稳定。

工厂方法模式的示例

1. 文档生成器

假设我们有一个文档生成系统,可以生成不同格式的文档,例如 PDF 和 Word 文档。我们可以使用工厂方法模式来创建具体的文档生成器。

from abc import ABC, abstractmethodclass Document(ABC):@abstractmethoddef save(self):passclass PDFDocument(Document):def save(self):return "Saving as PDF"class WordDocument(Document):def save(self):return "Saving as Word"class DocumentCreator(ABC):@abstractmethoddef create_document(self) -> Document:passclass PDFCreator(DocumentCreator):def create_document(self) -> Document:return PDFDocument()class WordCreator(DocumentCreator):def create_document(self) -> Document:return WordDocument()def client_code(creator: DocumentCreator):document = creator.create_document()print(document.save())print("Client: Creating a PDF document.")
client_code(PDFCreator())print("\nClient: Creating a Word document.")
client_code(WordCreator())
2. 数据库连接

假设我们有一个应用程序,可以连接到不同类型的数据库,例如 MySQL 和 PostgreSQL。我们可以使用工厂方法模式来创建具体的数据库连接器。

from abc import ABC, abstractmethodclass DatabaseConnection(ABC):@abstractmethoddef connect(self):passclass MySQLConnection(DatabaseConnection):def connect(self):return "Connecting to MySQL"class PostgreSQLConnection(DatabaseConnection):def connect(self):return "Connecting to PostgreSQL"class DatabaseCreator(ABC):@abstractmethoddef create_connection(self) -> DatabaseConnection:passclass MySQLCreator(DatabaseCreator):def create_connection(self) -> DatabaseConnection:return MySQLConnection()class PostgreSQLCreator(DatabaseCreator):def create_connection(self) -> DatabaseConnection:return PostgreSQLConnection()def client_code(creator: DatabaseCreator):connection = creator.create_connection()print(connection.connect())print("Client: Connecting to MySQL database.")
client_code(MySQLCreator())print("\nClient: Connecting to PostgreSQL database.")
client_code(PostgreSQLCreator())

通过使用工厂方法模式,我们将对象的创建过程与使用过程分离,使得代码更加灵活和可扩展。不同的具体创建者类实现不同的创建逻辑,使得系统可以方便地扩展和维护。

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

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

相关文章

安卓设备屏幕分辨率适配

需求 适配1.83寸的手表屏幕 屏幕分辨率为240px*284px dpi203.18 计量单位 px (Pixels): 其实就是像素单位,是屏幕上最小可见的单元,比如我们通常说的手机分辨列表800*400都是px的单位(px 的单位是 像素&am…

完美解决找不到steam_api64.dll无法执行代码问题

游戏缺失steam_api64.dll通常意味着该游戏依赖于Steam平台的一些功能或服务,而这个DLL文件是Steam客户端的一部分,用于游戏与Steam平台之间的交互。如果游戏中缺失这个文件,可能会出现无法启动、崩溃或其他问题。 一,详细了解stea…

第13关:存储过程1、第14关:存储过程2。(2021数据库期末一)

目录 首先需要学习和了解的知识 第13关:存储过程1 任务描述 答案 第14关:存储过程2 任务描述 答案 本篇博客的答案博主是学习别人得来的,敢于借鉴和学习哈哈!! 首先需要学习和了解的知识 了解什么是存储过程以及…

针对ARM64嵌入式系统的Linux内核参数优化

文章目录 0. 概要1. 网络性能优化开启TCP连接重用减少TCP连接超时时间 2. 文件系统和I/O优化提高文件描述符限制 3. 内存管理优化提高内存可用性 4. 内核调度优化调整CFS调度器的调度周期 5. 完整配置文件 0. 概要 在ARM64架构的嵌入式系统中,系统性能和资源优化至…

JeecgBoot v3.7.0 all 版本发布,前后端合并一个仓库

项目介绍 JeecgBoot是一款企业级的低代码平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue3,Mybatis-plus,Shiro,JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

音频——性能测试中的基本概念

文章目录 频率响应平均电平增益ADC 路径增益DAC 路径增益底噪信噪比总谐波失真+噪声(THD+N)延迟频率响应 对于音频设备,频率响应可以理解为音频设备对不同频率信号的处理或重现。对于音频信号频率,一般关注20Hz~20kHz范围。理想情况下,输入幅度相同的不同频率信号,过音频…

吴恩达机器学习 第二课 week4 决策树

目录 01 学习目标 02 实现工具 03 问题描述 04 构建决策树 05 总结 01 学习目标 (1)理解“熵”、“交叉熵(信息增益)”的概念 (2)掌握决策树的构建步骤与要点 02 实现工具 (1)…

常见的七大排序

目录 前言 冒泡排序 选择排序 插入排序 堆排序 希尔排序 快排 归并排序 前言 本文介绍七种常见的排序方式:冒泡排序,选择排序,插入排序,堆排序,希尔排序,快排,归并排序 冒泡排序 将每2…

Linux使用——查看发行版本、内核、shell类型等基本命令

先做快照 虚拟机中编辑网络 关机 普通账户和管理员账户 互相对照 localhost相当于IP 参数: 短格式:以减号(-)开头,参数字母 长格式:以2个减号(--)后跟上完整的参数单词 当前发行版本 [rootserver ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 9.…

压缩示例代码libarchive,zlib

文章目录 前言一、zlib库在内存中对数据进行压缩,defalteInit函数默认压缩为zlib格式在内存中将数据压缩为gzip格式 二、libarchive库压缩为tar.gz文件 总结 前言 记录用C/C实现数据压缩的代码 一、zlib库 home page: https://zlib.net/ manual: https://zlib.n…

Java日常探秘-从小疑问到实践智慧的编程之旅(1)

文章目录 前言一、Git中回滚操作的方式二、加密为第三方服务,需要rpc,怎么提高效率三、加解密需求,逻辑能够尽量收敛四、加解密优化五、加解密的rpc失败了处理机制六、优化MySQL查询总结 前言 所有分享的内容源于日常思考和实践,…

C++设计模式——Flyweight享元模式

一,享元模式简介 享元模式是一种结构型设计模式,它将每个对象中各自保存一份数据的方式改为多个对象共享同一份数据,该模式可以有效减少应用程序的内存占用。 享元模式的核心思想是共享和复用,通过设置共享资源来避免创建过多的实…

MSPM0G3507——定时器例程1——TIMA_periodic_repeat_count

以下示例以周期模式配置TimerA0,并使用重复计数功能每隔2秒切换一次GPIO。注意:重复计数功能特定于TimerA0实例,而不是其他TimerA实例。这里是一次500毫秒,重复了四次 主函数: #include "ti_msp_dl_config.h&quo…

Clickhouse备份恢复_Docker环境下的clickhouse如何备份恢复

总结: Docker环境的下的clickhouse备份,不能使用clickhouse-backup,因为clickhouse-client只能备份Docker环境下的clickhouse的元数据 Docker环境的下的clickhouse备份,可以使用TCP的clickhouse-client的9000或HTTP的8123连接clic…

20240621日志:大模型压缩-从闭源大模型蒸馏

目录 1. 核心内容2. 方法2.1 先验估计2.2 后验估计2.3 目标函数 3. 交叉熵损失函数与Kullback-Leibler(KL)损失函数 location:beijing 涉及知识:大模型压缩、知识蒸馏 Fig. 1 大模型压缩-知识蒸馏 1. 核心内容 本文提出在一个贝…

Program-of-Thoughts(PoT):结合Python工具和CoT提升大语言模型数学推理能力

Program of Thoughts Prompting:Disentangling Computation from Reasoning for Numerical Reasoning Tasks github:https://github.com/wenhuchen/Program-of-Thoughts 一、动机 数学运算和金融方面都涉及算术推理。先前方法采用监督训练的形式,但这…

英语笔记-专升本

2024年6月23日15点01分,今天自己听老师讲了一张试卷,自己要开始不断地进行一个做事,使自己可以不断地得到一个提升,自己可以提升的内容, 英语试卷笔记 ------------------------------------ | 英语试卷笔记 …

使用Python监控网络连接状态并自动启动和关闭软件

通过 Python 编写一个网络连接状态监测程序,以 Synology Drive软件为例。通过如下代码实现来演示如何监控网络连接状态并自动启动和关闭相关软件。 程序首先通过 ping 命令检查内网或外网的连接状态。如果连接的是外网,则程序会检查 Synology Drive 软件…

发表在SIGMOD 2024上的高维向量检索/向量数据库/ANNS相关论文

前言 SIGMOD 2024会议最近刚在智利圣地亚哥结束,有关高维向量检索/向量数据库/ANNS的论文主要有5篇,涉及混合查询(带属性或范围过滤的向量检索)优化、severless向量数据库优化、量化编码优化、磁盘图索引优化。此外,也…

微信小程序入门2

微信开发者工具的安装方法 1.打开微信开发者工具下载页面 在微信小程序管理后台的左侧边栏中选择“开发工具”,然后选择“开发者工具”,即可找到微信开发者工具的下载页面。 2.打开微信开发者工具的下载链接页面 单击“下载” 按钮下载,即…