python工厂模式

devtools/2025/3/31 22:42:48/

工厂模式简介

工厂模式是一种创建对象的设计模式,它将对象的创建和使用分离。其核心思想是通过一个工厂类来负责创建对象,而不是在客户端代码中直接实例化对象。这样做的好处有:

  • 降低耦合度:客户端代码不需要知道具体的对象创建细节,只需要向工厂请求所需的对象,减少了代码之间的依赖。
  • 提高可维护性和可扩展性:当需要添加新的产品类型时,只需在工厂类中添加相应的创建逻辑,而不需要修改客户端代码。

下面以一段代码讲解一下实现细节:

实现一个产品基类:

import abc
from enum import Enum# 定义一个抽象基类产品
class Product(metaclass=abc.ABCMeta):@abc.abstractmethoddef operation(self):pass
  • 导入模块abc 模块用于创建抽象基类,enum 模块用于创建枚举类型。
  • 抽象基类 Product:使用 abc.ABCMeta 作为元类定义了一个抽象基类 Product,并使用 @abc.abstractmethod 装饰器定义了抽象方法 operation。这意味着所有继承自 Product 的具体类都必须实现 operation 方法。

继承抽象基类Product,并实现operation方法:

# 具体产品类 1
class ConcreteProduct1(Product):def operation(self):return "ConcreteProduct1 operation"# 具体产品类 2
class ConcreteProduct2(Product):def operation(self):return "ConcreteProduct2 operation"
  • 具体产品类ConcreteProduct1 和 ConcreteProduct2 继承自 Product 抽象基类,并实现了 operation 方法。每个具体产品类都有自己独特的操作实现。

用枚举类型Enum定义产品的类型:

# 产品类型枚举
class ProductType(Enum):TYPE1 = 1TYPE2 = 2
  • 产品类型枚举:使用 enum.Enum 定义了一个枚举类 ProductType,用于表示不同类型的产品。这里定义了两种产品类型 TYPE1 和 TYPE2

创建一个工厂类实现生产细节:

# 工厂类
class Factory:@staticmethoddef create_product(product_type):if product_type == ProductType.TYPE1:return ConcreteProduct1()elif product_type == ProductType.TYPE2:return ConcreteProduct2()else:raise ValueError("Invalid product type")
  • 工厂类 Factory:包含一个静态方法 create_product,该方法接受一个 product_type 参数,根据传入的产品类型创建相应的产品实例。如果传入的产品类型无效,会抛出 ValueError 异常。

工厂实例化,传入产品类型的参数,调用函数生产产品:

# 客户端代码
if __name__ == "__main__":product1 = Factory.create_product(ProductType.TYPE1)print(product1.operation())product2 = Factory.create_product(ProductType.TYPE2)print(product2.operation())

完整代码如下:

import abc
from enum import Enum# 定义一个抽象基类产品
class Product(metaclass=abc.ABCMeta):@abc.abstractmethoddef operation(self):pass# 具体产品类 1
class ConcreteProduct1(Product):def operation(self):return "ConcreteProduct1 operation"# 具体产品类 2
class ConcreteProduct2(Product):def operation(self):return "ConcreteProduct2 operation"# 产品类型枚举
class ProductType(Enum):TYPE1 = 1TYPE2 = 2# 工厂类
class Factory:@staticmethoddef create_product(product_type):if product_type == ProductType.TYPE1:return ConcreteProduct1()elif product_type == ProductType.TYPE2:return ConcreteProduct2()else:raise ValueError("Invalid product type")# 客户端代码
if __name__ == "__main__":product1 = Factory.create_product(ProductType.TYPE1)print(product1.operation())product2 = Factory.create_product(ProductType.TYPE2)print(product2.operation())


http://www.ppmy.cn/devtools/171305.html

相关文章

【工程记录】QwQ-32b 8bit量化部署教程(vLLM | 缓解复读)

文章目录 写在前面1. 环境配置2. 下载QwQ-32b 8bit量化模型3. 使用vLLM本地推理 写在前面 仅作个人学习记录用。本文记录QwQ-32b 8bit量化模型的部署的详细方法。 1. 环境配置 以下环境经测试无bug(Deepseek R1用这个环境也能直接跑): gp…

基于大模型预测的初治菌阳肺结核诊疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 二、初治菌阳肺结核概述 2.1 疾病定义与病理机制 2.2 流行病学特征 2.3 传统诊疗方法与局限性 三、大模型在初治菌阳肺结核预测中的应用原理 3.1 大模型技术简介 3.2 数据收集与预处理 3.3 模型构建与训练 3.4 模型…

MATLAB中构建模式表达式

目录 构建简单模式 边界模式 分步构建复杂模式 组织模式显示 模式是帮助搜索和修改文本的工具。与正则表达式类似,模式定义匹配文本的规则。模式可与文本搜索函数(如 contains、matches 和 extract)结合使用来指定这些函数作用于文本的哪…

【TCP/IP、HTTP等网络协议】

网络协议概述 网络协议是计算机网络中用于规范数据传输的一组规则和标准。它们定义了数据的格式、传输方式、错误检测和纠正机制等。不同的协议在不同的网络层次中发挥作用,确保数据能够在复杂的网络环境中可靠地传输。 1. TCP/IP 协议 TCP/IP(Transm…

数据结构--二叉排序树

一、二叉排序树的定义 二叉排序树&#xff0c;又称二叉查找树。 性质&#xff1a; 左子树结点值<根结点值<右子树结点值&#xff08;进行中序遍历&#xff0c;可以得到一个递增的有序序列&#xff09; 二、查找操作 利用二叉排序树的性质&#xff0c;如果树空&#xff0c…

SSE底层实现?SSE 和 websocket的区别?

SSE(Server-Sent Events)和 WebSocket 是两种常见的实现服务器与客户端实时通信的技术,但它们的底层实现、适用场景和特性有显著区别。以下是对 SSE 和 WebSocket 的详细对比,包括底层实现、优缺点以及适用场景。 1. SSE(Server-Sent Events) 1.1 底层实现 SSE 是基于 …

字节手撕题 小于 n 的最大整数 贪心 回溯 剪枝 全排列

给定一个数字字符串S和一个数组nums&#xff0c;数组中的元素都在0~9之间&#xff0c;问从数组中选择元素组成的数字&#xff0c;小于N的最大值是多少&#xff1f; 例如&#xff1a;S “24378”&#xff0c;nums:{2,3,9}&#xff0c;组成的最大值为23999。 &#x1f468;‍&am…

Docker镜像迁移方案

Docker镜像迁移方案 文章目录 Docker镜像迁移方案一&#xff1a;背景二&#xff1a;操作方式三&#xff1a;异常原因参考&#xff1a; 一&#xff1a;背景 比如机器上已经有先有的容器&#xff0c;但是docker pull的时候是失败的二&#xff1a;操作方式 1、停止正在运行的容器…