工厂函数详解:概念、目的与作用

news/2025/3/28 10:43:38/

sdnimg.cn/direct/7d3be7b8322748ccb354e58f35aa2f8c.png" alt="在这里插入图片描述" />

一、什么是工厂函数

工厂函数(Factory Function)是一种设计模式,其核心是通过一个函数来 创建并返回对象,而不是直接使用 new 或构造函数实例化对象。它封装了对象的创建过程,使代码更灵活、可维护。


二、工厂函数的目的与作用
目的作用
解耦对象创建逻辑将对象的创建与使用分离,调用者无需关心对象的具体实现细节。
延迟实例化仅在需要时创建对象,避免资源浪费(如内存、CPU)。
支持动态参数根据输入参数返回不同类型的对象(多态性)。
统一接口提供标准化的对象创建方式,便于扩展和维护。

三、工厂函数示例
1. 简单工厂:形状创建

假设需要根据用户输入创建不同形状(圆形、矩形),直接实例化会导致代码冗余和耦合:

# 无工厂函数的问题
if shape_type == 'circle':obj = Circle(radius=5)
elif shape_type == 'rectangle':obj = Rectangle(width=3, height=4)

使用工厂函数优化后:

# 定义形状类
class Circle:def __init__(self, radius):self.radius = radiusclass Rectangle:def __init__(self, width, height):self.width = widthself.height = height# 工厂函数
def shape_factory(shape_type, **kwargs):if shape_type == 'circle':return Circle(**kwargs)elif shape_type == 'rectangle':return Rectangle(**kwargs)else:raise ValueError("Unknown shape type")# 调用
circle = shape_factory('circle', radius=5)
rectangle = shape_factory('rectangle', width=3, height=4)
2. Mininet 中的工厂函数

在 Mininet 自定义拓扑中,lambda: MyTopo() 是一个工厂函数

# 工厂函数:延迟创建 MyTopo 实例
topos = {'mytopo': (lambda: MyTopo())}

当 Mininet 需要构建拓扑时,会调用 topos['mytopo']() 执行 Lambda 函数,动态生成 MyTopo 实例。


四、工厂函数的优势
1. 避免紧耦合
  • 直接实例化:调用方需知道具体类的构造函数。
  • 工厂函数:调用方只需传递参数,无需了解类细节。
2. 灵活扩展

新增对象类型时,只需修改工厂函数,无需修改调用代码。

# 扩展支持三角形
class Triangle:def __init__(self, base, height):self.base = baseself.height = heightdef shape_factory(shape_type, **kwargs):# 原有逻辑...elif shape_type == 'triangle':return Triangle(**kwargs)
3. 资源管理

延迟实例化可节省内存和计算资源,尤其是在对象创建成本高时(如数据库连接)。


五、工厂函数 vs 直接实例化
场景直接实例化工厂函数
简单对象创建适合(如 obj = MyClass()过渡设计
复杂/条件化创建代码冗余,难以维护统一管理,逻辑清晰
需要延迟加载无法实现天然支持
多态性需求需手动判断类型封装在工厂中,对调用方透明

六、工厂模式的其他形式
  1. 工厂方法模式
    每个子类实现自己的工厂方法(面向对象设计中的经典模式)。

  2. 抽象工厂模式
    创建一组相关或依赖对象的接口(如 GUI 库中的跨平台组件)。


七、总结
  • 核心思想工厂函数通过封装对象创建逻辑,提升代码的灵活性和可维护性。
  • 在 Mininet 中的应用lambda: MyTopo() 作为工厂函数,确保 Mininet 在运行时动态创建拓扑实例。
  • 适用场景:对象创建逻辑复杂、需要延迟加载或支持多态性时优先使用。

通过合理使用工厂函数,可以显著提高代码的模块化程度,降低系统各部分之间的依赖。


http://www.ppmy.cn/news/1580881.html

相关文章

高级java每日一道面试题-2025年2月26日-框架篇[Mybatis篇]-Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式 ?

如果有遗漏,评论区告诉我进行补充 面试官: Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式 ? 我回答: 在Java高级面试中讨论MyBatis如何将SQL执行结果封装为目标对象并返回的过程时,我们可以从过程细节和映射形式两个方面来综合解答这个问…

树莓集团宜宾产业园:建设与发展的全方位解析​

树莓集团宜宾产业园的建设与发展,是区域数字经济转型升级的重要引擎。以下从多个维度进行解析: 产业聚集效应 宜宾产业园通过吸引数字企业入驻,构建完整的数字经济产业链。这不仅推动当地数字产业的蓬勃发展,还促进相关产业的协…

嵌入式4-Modbus

1.Modbus Modbus 是一种广泛应用于工业自动化领域的通信协议,用于在不同设备(如传感器、PLC、变频器、仪表等)之间交换数据。它支持串行通信(如 RS232、RS485)和以太网通信(Modbus TCP)&#x…

Spring IoC DI入门

一、Spring,Spring Boot和Spring MVC的联系及区别 Spring是另外两个框架的基础,是Java生态系统的核心框架,而SpringMVC是Spring 的子模块,专注于 Web 层开发,基于 MVC 设计模式(模型-视图-控制器&#xff…

ModuleNotFoundError: No module named ‘flask‘ 错误

要解决 ModuleNotFoundError: No module named ‘flask’ 错误,需确保已正确安装 Flask 库。以下是详细步骤: ‌1. 安装 Flask‌ 在终端或命令行中执行以下命令(注意权限问题): 使用 pip 安装 pip install flask 若…

内存池项目

内存池项目 一些共同的知识 std::array<std::atomic<void*>, FREE_LIST_SIZE> centralFreeList_;这个就是创建了一个centralFreeList_&#xff0c;他是一个array数组&#xff0c;它里面的类型都是atomic<void*>的&#xff0c;表示原子指针&#xff0c;操作…

【JAVA】八、“方法的使用”知识点详细整理(持续更新中)

目录 8. 方法概念及使用 8.1 方法定义 1. 语法格式 2. 详细说明 8.2 方法调用的执行过程 1. 具体过程 2. 栈帧的理解 8.3 实参和形参的关系 1. 形参&#xff08;形式参数&#xff09; 2. 实参&#xff08;实际参数&#xff09; 8.4 没有返回值的方法 8.5 方法重…

全球化2.0 | ZStack云计算系统工程师(ZCCE)国际认证培训成功举办

近日&#xff0c;ZStack云计算系统工程师&#xff08;ZCCE&#xff09;国际认证培训在上海成功举办。本次培训采用 "线下 线上直播" 双轨模式&#xff0c;同步开设中文与英文课程&#xff0c;吸引了来自中国、东南亚、独联体、北美、中东等多个国家和地区的近 90 名…