工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)
模式定义
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,通过定义抽象工厂接口将对象创建过程延迟到子类实现,实现对象创建与使用的解耦。该模式特别适合需要动态扩展产品类型的场景。
自动驾驶感知场景分析
自动驾驶感知系统需要集成多种传感器:
- 激光雷达(LiDAR):3D点云数据采集
- 摄像头(Camera):2D图像数据采集
- 毫米波雷达(Radar):运动目标检测
- 超声波传感器(Ultrasonic):近距离障碍物检测
我们将通过工厂方法实现不同传感器的统一创建管理。
C++实现代码(含详细注释)
#include <iostream>
#include <memory>
#include <vector>// ---------------------------- 产品体系 ----------------------------
// 抽象传感器接口
class Sensor {
public:virtual ~Sensor() = default;// 传感器初始化(纯虚函数)virtual void initialize() = 0;// 数据采集(纯虚函数)virtual void acquireData() = 0;// 数据处理(默认实现)virtual void processData() {std::cout << "[通用处理] 数据格式标准化..." << std::endl;}
};// 具体产品:激光雷达
class LiDAR : public Sensor {
private:double scanFrequency; // 扫描频率参数public:explicit LiDAR(double freq) : scanFrequency(freq) {}void initialize() override {std::cout << "[LiDAR] 初始化激光雷达,扫描频率: " << scanFrequency << "Hz" << std::endl;}void acquireData() override {std::cout << "[LiDAR] 采集3D点云数据("<< scanFrequency << "Hz扫描中)" << std::endl;}void processData() override {Sensor::processData();std::cout << "[LiDAR处理] 点云聚类/目标检测" << std::endl;}
};// 具体产品:摄像头
class Camera : public Sensor {
private:std::string resolution; // 分辨率参数public:explicit Camera(const std::string& res) : resolution(res) {}void initialize() override {std::cout << "[Camera] 初始化摄像头,分辨率: "<< resolution << std::endl;}void acquireData() override {std::cout << "[Camera] 捕获RGB图像("<< resolution << "分辨率)" << std::endl;}void processData() override {Sensor::processData();std::cout << "[Camera处理] 图像特征提取/目标识别" << std::endl;}
};// ---------------------------- 工厂体系 ----------------------------
// 抽象传感器工厂
class SensorFactory {
public:virtual ~SensorFactory() = default;// 工厂方法(创建特定传感器)virtual std::unique_ptr<Sensor> createSensor() = 0;// 通用配置方法void commonConfiguration() {std::cout << "加载传感器通用配置..." << std::endl;}
};// 具体工厂:LiDAR工厂
class LiDARFactory : public SensorFactory {
private:double frequency; // 工厂特定参数public:explicit LiDARFactory(double freq) : frequency(freq) {}std::unique_ptr<Sensor> createSensor() override {commonConfiguration();std::cout << "创建LiDAR实例..." << std::endl;return std::make_unique<LiDAR>(frequency);}
};// 具体工厂:Camera工厂
class CameraFactory : public SensorFactory {
private:std::string resolution;public:explicit CameraFactory(const std::string& res) : resolution(res) {}std::unique_ptr<Sensor> createSensor() override {commonConfiguration();std::cout << "创建Camera实例..." << std::endl;return std::make_unique<Camera>(resolution);}
};// ---------------------------- 系统集成 ----------------------------
class PerceptionSystem {
private:std::vector<std::unique_ptr<Sensor>> sensors;public:// 添加传感器(通过工厂创建)void addSensor(SensorFactory& factory) {auto sensor = factory.createSensor();sensor->initialize();sensors.push_back(std::move(sensor));}// 运行感知流水线void runPipeline() {std::cout << "\n=== 启动感知系统 ===" << std::endl;for(auto& sensor : sensors) {sensor->acquireData();sensor->processData();}}
};// ---------------------------- 客户端使用 ----------------------------
int main() {PerceptionSystem system;// 配置工厂参数LiDARFactory lidarFactory(10.0); // 10Hz扫描频率CameraFactory cameraFactory("1920x1080"); // 高清摄像头// 构建传感器系统system.addSensor(lidarFactory);system.addSensor(cameraFactory);// 运行系统system.runPipeline();return 0;
}
代码解析
1. 产品体系设计
class Sensor { /*...*/ }; // 抽象产品
class LiDAR : public Sensor { /*...*/ }; // 具体产品
class Camera : public Sensor { /*...*/ }; // 具体产品
- Sensor基类:定义传感器通用接口(初始化、数据采集、处理)
- 具体传感器:实现特定传感器逻辑,可携带专有参数(如扫描频率)
2. 工厂体系实现
class SensorFactory { /*...*/ }; // 抽象工厂
class LiDARFactory : public SensorFactory { /*...*/ }; // 具体工厂
- 工厂基类:声明
createSensor()工厂方法 - 具体工厂:
- 持有产品创建所需参数
- 实现具体产品创建逻辑
- 可添加工厂级预处理(如配置验证)
3. 系统集成
class PerceptionSystem {void addSensor(SensorFactory& factory) {auto sensor = factory.createSensor();// ...}
};
- 感知系统:通过工厂接口添加传感器,无需关心具体类型
- 运行时行为:统一调用接口方法,实现多态处理
运行结果
加载传感器通用配置...
创建LiDAR实例...
[LiDAR] 初始化激光雷达,扫描频率: 10Hz
加载传感器通用配置...
创建Camera实例...
[Camera] 初始化摄像头,分辨率: 1920x1080=== 启动感知系统 ===
[LiDAR] 采集3D点云数据(10Hz扫描中)
[通用处理] 数据格式标准化...
[LiDAR处理] 点云聚类/目标检测
[Camera] 捕获RGB图像(1920x1080分辨率)
[通用处理] 数据格式标准化...
[Camera处理] 图像特征提取/目标识别
模式优势分析
在自动驾驶中的价值
-
传感器管理
- 灵活扩展新传感器(如新增Radar传感器)
- 统一生命周期管理(初始化/数据采集)
-
配置解耦
- 传感器参数(分辨率/频率)由工厂管理
- 系统核心代码不依赖具体传感器实现
-
多平台适配
- 不同车规硬件使用不同工厂实现
- 通过替换工厂实现传感器切换
扩展改进建议
1. 动态配置加载
// 通过配置文件创建工厂
std::unique_ptr<SensorFactory> createFactoryFromConfig(const json& config)
{if(config["type"] == "LiDAR") {return std::make_unique<LiDARFactory>(config["frequency"]);}// 其他类型处理...
}
2. 复合传感器支持
class SensorClusterFactory : public SensorFactory {std::vector<std::unique_ptr<Sensor>> createSensor() override {// 创建多个传感器组成集群}
};
3. 异常处理增强
try {sensor->initialize();
} catch (const SensorException& e) {std::cerr << "传感器初始化失败: " << e.what();// 切换备用传感器工厂
}
工厂方法模式总结
核心价值:
- 将对象创建与使用分离,符合单一职责原则
- 提高系统可扩展性,新增产品类型无需修改已有代码
适用场景:
- 需要支持多类型传感器的自动驾驶系统
- 需要灵活替换不同品牌传感器的车规平台
- 需要统一管理传感器生命周期的中间件
通过本实现可以看出,工厂方法模式为自动驾驶感知系统的传感器管理提供了优雅的架构解决方案,是构建可扩展、易维护的自动驾驶系统的重要设计手段。
相关文章:
工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)
模式定义 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,通过定义抽象工厂接口将对象创建过程延迟到子类实现,实现对象创建与使用的解耦。该模式特别适合需要动态扩展产品类型的场景。 自动驾驶感知场景分析 自动驾…...
Redis之Java操作redis
零:在test测试类下创建一个类 SpringBootTest public class SpringDateRedisTest {... } 一:五大操作类型 Autowiredprivate RedisTemplate redisTemplate;Testpublic void testRedisTemplate() {System.out.println(redisTemplate);ValueOperations v…...
Kafka 面试,java实战贴
面试问题列表 Kafka的ISR机制是什么?如何保证数据一致性? 如何实现Kafka的Exactly-Once语义? Kafka的Rebalance机制可能引发什么问题?如何优化? Kafka的Topic分区数如何合理设置? 如何设计Kafka的高可用跨…...
linux多线(进)程编程——(9)信号量(一)
前言 在找到了共享内存存在的问题后,进程君父子着手开始解决这些问题。他们发明了一个新的神通——信号量。 信号量 信号量是一个计数器,用于管理对共享资源的访问权限。主要特点包括: (1)是一个非负整数 ÿ…...
PFLM: Privacy-preserving federated learning with membership proof证明阅读
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…...
关闭111端口监听
默认rpcbind服务会使用111端口,如果想禁用111端口,只需要禁用rpcbind服务即可: systemctl stop rpcbind.socket systemctl disable rpcbind.socket#检查111端口是否禁用成功 netstat -tuln |grep 111rpcbind 服务详解 rpcbind 服务…...
C++中的引用:深入理解与实用示例
文章目录 C中的引用:深入理解与实用示例一、引用的基本概念二、引用作为别名的应用三、引用作为函数参数四、指针与引用的区别五、常量引用六、引用与返回值七、总结 C中的引用:深入理解与实用示例 在C编程中,“引用”是一个强大而重要的概念…...
图片转base64 - 加菲工具 - 在线转换
图片转base64 - 加菲工具 先进入“加菲工具” 网 打开 https://www.orcc.top, 选择 “图片转base64”功能 选择需要转换的图片 复制 点击“复制”按钮,即可复制转换好的base64编码数据,可以直接用于img标签。...
opencv 对图片的操作
对图片的操作 1.图片镜像旋转(cv2.flip())2 图像的矫正 1.图片镜像旋转(cv2.flip()) 图像的旋转是围绕一个特定点进行的,而图像的镜像旋转则是围绕坐标轴进行的。图像的镜像旋转分为水平翻转、垂直翻转、水平垂直翻转…...
LabVIEW数据采集与传感系统
开发了一个基于LabVIEW的智能数据采集系统,该系统主要通过单片机与LabVIEW软件协同工作,实现对多通道低频传感器信号的有效采集、处理与显示。系统的设计旨在提高数据采集的准确性和效率,适用于各种需要高精度和低成本解决方案的工业场合。 项…...
【Easylive】Gateway模块 bootstrap.yml 解析
【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 Gateway模块 bootstrap.yml 常规解析 该配置文件定义了 Spring Cloud Gateway 的核心配置,包括 环境配置、服务注册、动态路由规则 等。以下是逐项解析: 1. 基础配…...
matlab 环形单层柱状图
matlab 环形单层柱状图 matlab 环形单层柱状图 matlab 环形单层柱状图 图片 图片 【图片来源粉丝】 我给他的思路是:直接使用风玫瑰图可以画出。 rose_bar 本次我的更新和这个有些不同!是环形柱状图,可调节细节多; 只需要函数…...
文献×汽车 | 基于 ANSYS 的多级抛物线板簧系统分析
板簧系统是用于减弱或吸收动态系统中发生的应力、应变、偏转和变形等破坏性因素的机械结构。板簧系统可能对外力产生不同的响应,具体取决于其几何结构和材料特性。板簧系统的计算机辅助分析对于高精度确定系统的变形特性和结构特性至关重要。 在这项工作中ÿ…...
MySQL:如何用关系型数据库征服NoSQL核心战场?
写在前面:当SQL遇见NoSQL的十年之变 2012年MongoDB掀起文档数据库革命时,开发者们不得不在灵活性与事务一致性之间做痛苦抉择。十年后的今天,MySQL 8.0的JSON功能已实现: ✅ 二进制存储效率超越传统BLOB 40% ✅ 多值索引使JSON查…...
分布式之CAP原则:理解分布式系统的核心设计哲学
声明:CAP中的P原则都是需要带着的 在分布式系统的设计与实践中,CAP原则(又称CAP定理)是开发者必须掌握的核心理论之一。它揭示了分布式系统在一致性(Consistency)、可用性(Availability&#x…...
RHCE 练习二:通过 ssh 实现两台主机免密登录以及 nginx 服务通过多 IP 区分多网站
一、题目要求 1.配置ssh实现A,B主机互相免密登录 2.配置nginx服务,通过多ip区分多网站 二、实验 实验开始前需准备两台 linux 主机便于充当服务端以及客户端,两台主机 IP 如下图: 实验1:配置 ssh 实现 A࿰…...
瑞吉外卖-分页功能开发中的两个问题
1.分页功能-前端页面展示显示500 原因:项目启动失败 解决:发现是Category实体类中,多定义了一个删除字段,但是我数据库里面没有is_deleted字段,导致查询数据库失败,所以会导致500错误。因为类是从网上其他帖…...
工业物联网安全网关 —— 安全OTA升级签名验证
这里写目录标题 工业物联网安全网关 —— 安全OTA升级签名验证一、项目背景与简介1.1 背景介绍1.2 OTA升级的安全挑战1.3 项目目标二、理论基础与关键技术2.1 数字签名基础2.2 OTA升级签名验证原理2.3 关键技术与安全算法三、系统架构设计3.1 系统模块划分3.2 系统架构图(Merm…...
生信分析平台Galaxy是使用什么语言编程?是R语言吗?
Galaxy平台是一个基于**Python**开发的开放源代码生物信息学分析平台,而非主要依赖R语言。以下是关键细节: 1. **核心语言** - **后端**:主要用**Python**(Django/Flask框架)实现服务器逻辑、工具集成和API。 …...
【Rust 精进之路之第10篇-借用·规则】引用 (``, `mut`):安全、高效地访问数据
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:所有权的“限制”与“变通”之道 在上一篇【所有权核心】中,我们揭示了 Rust 如何通过所有权规则和移动 (Move) 语义来保证内存安全,避免了垃圾回收器的同时,也防止了诸…...
基于瑞芯微RK3576国产ARM八核2.2GHz A72 工业评估板——Docker容器部署方法说明
前 言 本文适用开发环境: Windows开发环境:Windows 7 64bit、Windows 10 64bit Linux开发环境:VMware16.2.5、Ubuntu22.04.5 64bit U-Boot:U-Boot-2017.09 Kernel:Linux-6.1.115 LinuxSDK:LinuxSDK-[版本号](基于rk3576_linux6.1_release_v1.1.0) Docker是一个开…...
Kafka安全认证技术:SASL/SCRAM-ACL方案详解
#作者 :张桐瑞 文章目录 1Kafka安全认证技术介绍2基础设置3 配置SASL/SCRAM认证3.1编写server.properties配置3.2编写kafka.conf密码文件3.3编写user.properties配置文件3.4编写kafka-run-class.sh脚本文件3.5Zk中增加kafka用户3.6启动kafka进程 1Kafka安全认证技术…...
MySQL VS SQL Server:优缺点全解析
数据库选型、企业协作、技术生态、云数据库 1.1 MySQL优缺点分析 优点 开源免费 社区版完全免费,适合预算有限的企业 允许修改源码定制功能(需遵守GPL协议) 跨平台兼容性 支持Windows/Linux/macOS,适配混合环境部署 云服务商…...
探索 Flowable 后端表达式:简化流程自动化
什么是后端表达式? 在 Flowable 中,后端表达式是一种强大的工具,用于在流程、案例或决策表执行期间动态获取或设置变量。它还能实现自定义逻辑,或将复杂逻辑委托…… 后端表达式在 Flowable 的后端运行,无法访问前端…...
Mysql的redolog
保证事务持久性,用于崩溃恢复,崩溃恢复时,把redo上记载的页读到内存,对其修改,变为脏页,刷盘运用于WAL技术,将随机写改为顺序写 redo log有三种状态: 存在 redo log buffer 中&…...
HDFS入门】HDFS安全与权限管理解析:从认证到加密的完整指南
目录 引言 1 认证与授权机制 1.1 Kerberos认证集成 1.2 HDFS ACL细粒度控制 2 数据加密保护 2.1 传输层加密(SSL/TLS) 2.2 静态数据加密 3 审计与监控体系 3.1 操作审计流程 3.2 安全监控指标 4 权限模型详解 4.1 用户/组权限模型 4.2 umask配置原理 5 安全最佳实…...
React-useImperativeHandle (forwardRef)
我们会遇到这样的场景:某个组件想要暴露一些方法,来供外部组件来调用。例如我们在开发form表单的时候,就需要把设置表单值、重置值、提交等方法暴露给外部使用。会有如下代码: import { forwardRef } from react;const Form for…...
Mediatek Android13 设置Launcher
概述: 本章将围绕Launcher讲述两种修改默认Launcher的情况。 一:完全覆盖 第一种方法和预置apk类似,区别在于增加LOCAL_OVERRIDES_PACKAGES说明,该方法会完全覆盖系统默认的Launcher。 关于如何预置apk,可见另一篇文章: Mediatek Android13 预置APP-CSDN博客 修改A…...
性能比拼: Go vs Java
本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Java: Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中,我们将比较 Go 和 Java。 我们将基于 Golang 的 Fiber 框架和 Java 的 Spring Boot 创建几个简单的应用…...
ElMessageBox消息弹框(vue3总结)
一 展示各种内容 const checkCheckbox (check: any, formEl: any) > {ElMessageBox({title: "服务协议及隐私权政策",message: h("p", null, [h("span", null, "我已阅读并同意 "),h("span",{style: "color: #477F…...
