工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)

news2025/4/23 23:31:45

模式定义

工厂方法模式(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处理] 图像特征提取/目标识别

模式优势分析

在自动驾驶中的价值
  1. 传感器管理

    • 灵活扩展新传感器(如新增Radar传感器)
    • 统一生命周期管理(初始化/数据采集)
  2. 配置解耦

    • 传感器参数(分辨率/频率)由工厂管理
    • 系统核心代码不依赖具体传感器实现
  3. 多平台适配

    • 不同车规硬件使用不同工厂实现
    • 通过替换工厂实现传感器切换

扩展改进建议

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();
    // 切换备用传感器工厂
}

工厂方法模式总结

核心价值

  • 将对象创建与使用分离,符合单一职责原则
  • 提高系统可扩展性,新增产品类型无需修改已有代码

适用场景

  • 需要支持多类型传感器的自动驾驶系统
  • 需要灵活替换不同品牌传感器的车规平台
  • 需要统一管理传感器生命周期的中间件

通过本实现可以看出,工厂方法模式为自动驾驶感知系统的传感器管理提供了优雅的架构解决方案,是构建可扩展、易维护的自动驾驶系统的重要设计手段。

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

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

相关文章

Kafka 面试,java实战贴

面试问题列表 Kafka的ISR机制是什么&#xff1f;如何保证数据一致性&#xff1f; 如何实现Kafka的Exactly-Once语义&#xff1f; Kafka的Rebalance机制可能引发什么问题&#xff1f;如何优化&#xff1f; Kafka的Topic分区数如何合理设置&#xff1f; 如何设计Kafka的高可用跨…

linux多线(进)程编程——(9)信号量(一)

前言 在找到了共享内存存在的问题后&#xff0c;进程君父子着手开始解决这些问题。他们发明了一个新的神通——信号量。 信号量 信号量是一个计数器&#xff0c;用于管理对共享资源的访问权限。主要特点包括&#xff1a; &#xff08;1&#xff09;是一个非负整数 &#xff…

PFLM: Privacy-preserving federated learning with membership proof证明阅读

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

图片转base64 - 加菲工具 - 在线转换

图片转base64 - 加菲工具 先进入“加菲工具” 网 打开 https://www.orcc.top&#xff0c; 选择 “图片转base64”功能 选择需要转换的图片 复制 点击“复制”按钮&#xff0c;即可复制转换好的base64编码数据&#xff0c;可以直接用于img标签。

opencv 对图片的操作

对图片的操作 1.图片镜像旋转&#xff08;cv2.flip()&#xff09;2 图像的矫正 1.图片镜像旋转&#xff08;cv2.flip()&#xff09; 图像的旋转是围绕一个特定点进行的&#xff0c;而图像的镜像旋转则是围绕坐标轴进行的。图像的镜像旋转分为水平翻转、垂直翻转、水平垂直翻转…

LabVIEW数据采集与传感系统

开发了一个基于LabVIEW的智能数据采集系统&#xff0c;该系统主要通过单片机与LabVIEW软件协同工作&#xff0c;实现对多通道低频传感器信号的有效采集、处理与显示。系统的设计旨在提高数据采集的准确性和效率&#xff0c;适用于各种需要高精度和低成本解决方案的工业场合。 项…

【Easylive】​​Gateway模块 bootstrap.yml 解析

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 Gateway模块 bootstrap.yml 常规解析 该配置文件定义了 Spring Cloud Gateway 的核心配置&#xff0c;包括 环境配置、服务注册、动态路由规则 等。以下是逐项解析&#xff1a; 1. 基础配…

matlab 环形单层柱状图

matlab 环形单层柱状图 matlab 环形单层柱状图 matlab 环形单层柱状图 图片 图片 【图片来源粉丝】 我给他的思路是&#xff1a;直接使用风玫瑰图可以画出。 rose_bar 本次我的更新和这个有些不同&#xff01;是环形柱状图&#xff0c;可调节细节多&#xff1b; 只需要函数…

文献×汽车 | 基于 ANSYS 的多级抛物线板簧系统分析

板簧系统是用于减弱或吸收动态系统中发生的应力、应变、偏转和变形等破坏性因素的机械结构。板簧系统可能对外力产生不同的响应&#xff0c;具体取决于其几何结构和材料特性。板簧系统的计算机辅助分析对于高精度确定系统的变形特性和结构特性至关重要。 在这项工作中&#xff…

RHCE 练习二:通过 ssh 实现两台主机免密登录以及 nginx 服务通过多 IP 区分多网站

一、题目要求 1.配置ssh实现A&#xff0c;B主机互相免密登录 2.配置nginx服务&#xff0c;通过多ip区分多网站 二、实验 实验开始前需准备两台 linux 主机便于充当服务端以及客户端&#xff0c;两台主机 IP 如下图&#xff1a; 实验1&#xff1a;配置 ssh 实现 A&#xff0…

瑞吉外卖-分页功能开发中的两个问题

1.分页功能-前端页面展示显示500 原因&#xff1a;项目启动失败 解决&#xff1a;发现是Category实体类中&#xff0c;多定义了一个删除字段&#xff0c;但是我数据库里面没有is_deleted字段&#xff0c;导致查询数据库失败&#xff0c;所以会导致500错误。因为类是从网上其他帖…

工业物联网安全网关 —— 安全OTA升级签名验证

这里写目录标题 工业物联网安全网关 —— 安全OTA升级签名验证一、项目背景与简介1.1 背景介绍1.2 OTA升级的安全挑战1.3 项目目标二、理论基础与关键技术2.1 数字签名基础2.2 OTA升级签名验证原理2.3 关键技术与安全算法三、系统架构设计3.1 系统模块划分3.2 系统架构图(Merm…

探索 Flowable 后端表达式:简化流程自动化

什么是后端表达式&#xff1f; 在 Flowable 中&#xff0c;后端表达式是一种强大的工具&#xff0c;用于在流程、案例或决策表执行期间动态获取或设置变量。它还能实现自定义逻辑&#xff0c;或将复杂逻辑委托…… 后端表达式在 Flowable 的后端运行&#xff0c;无法访问前端…

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 安全最佳实…

性能比拼: Go vs Java

本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Java: Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中&#xff0c;我们将比较 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…

Jupyter Notebook 中切换/使用 conda 虚拟环境的方式(解决jupyter notebook 环境默认在base下面的问题)

使用 nb_conda_kernels 添加所有环境 一键添加所有 conda 环境 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda in…

Tailwind CSS 开发入门:掌握基础语法要点

在前端开发中&#xff0c;Tailwind CSS 以原子化设计和实用类系统&#xff0c;构建精美页面的得力工具&#xff0c;摒弃传统 CSS 繁琐写法。掌握其基础语法是熟练运用它的关键&#xff0c;下面将详细介绍核心基础语法。 一、核心基础语法 1. 颜色类 Tailwind CSS 提供了丰富…

Java八股 深入理解Spring的AOP 面向切面编程 底层 保姆级教程 手写例子

目录 概念 AOP 术语 1. 连接点&#xff08;Jointpoint&#xff09;&#xff1a; 2. 切入点&#xff08;Pointcut&#xff09;&#xff1a; 3. 通知&#xff08;Advice&#xff09;&#xff1a; 4. 方面/切面&#xff08;Aspect&#xff09;&#xff1a; 5. 引入&#xff…

C++std::map

1. 概述​​ ​​定义​​&#xff1a;std::map 是C标准模板库&#xff08;STL&#xff09;中的关联容器&#xff0c;以键值对&#xff08;key-value pairs&#xff09;形式存储元素&#xff0c;支持快速查找和有序访问。 ​​- 头文件​​&#xff1a;#include ​​底层实现​…