当前位置: 首页 > news >正文

建造者模式详解及其在自动驾驶场景的应用举例(以C++代码实现)

模式定义

建造者模式(Builder Pattern)是一种创建型设计模式,用于分步构造复杂对象。该模式将对象构建过程与其表示分离,支持通过相同构建过程生成不同表现形式,特别适合需要灵活配置的自动驾驶车辆系统搭建场景。


自动驾驶应用场景

典型的建造者模式应用场景包括:

  1. 车辆配置管理:灵活组合传感器套件、计算单元和算法参数
  2. 场景配置生成:构建不同测试场景(城市道路/高速公路/极端天气)
  3. 系统参数包:创建包含多个子系统配置的参数集合

本文以自动驾驶车辆配置管理为例进行实现。


C++代码实现(含详细注释)

#include <iostream>
#include <memory>
#include <vector>
#include <unordered_map>// ---------------------------- 产品类 ----------------------------
class VehicleConfig {
public:// 配置参数类型using ParameterMap = std::unordered_map<std::string, float>;void addSensor(const std::string& sensor) {sensors_.push_back(sensor);}void setComputeUnit(const std::string& unit) {compute_unit_ = unit;}void setAlgorithmParam(const std::string& key, float value) {algorithm_params_[key] = value;}void display() const {std::cout << "\n=== 车辆配置详情 ===" << std::endl;std::cout << "传感器系统:" << std::endl;for (const auto& sensor : sensors_) {std::cout << "  - " << sensor << std::endl;}std::cout << "\n计算单元:" << compute_unit_ << std::endl;std::cout << "\n算法参数:" << std::endl;for (const auto& [k, v] : algorithm_params_) {std::cout << "  " << k << " = " << v << std::endl;}}private:std::vector<std::string> sensors_;    // 传感器列表std::string compute_unit_;            // 计算单元型号ParameterMap algorithm_params_;       // 算法参数集合
};// ---------------------------- 抽象建造者 ----------------------------
class ConfigBuilder {
public:virtual ~ConfigBuilder() = default;virtual void reset() = 0;virtual void buildSensors() = 0;virtual void buildComputeUnit() = 0;virtual void buildAlgorithmParams() = 0;std::unique_ptr<VehicleConfig> getResult() {return std::move(config_);}protected:std::unique_ptr<VehicleConfig> config_;  // 产品对象
};// ---------------------------- 具体建造者 ----------------------------
// 豪华型配置建造者
class LuxuryBuilder : public ConfigBuilder {
public:void reset() override {config_ = std::make_unique<VehicleConfig>();}void buildSensors() override {config_->addSensor("128线激光雷达");config_->addSensor("800万像素双目相机");config_->addSensor("4D毫米波雷达");config_->addSensor("超声波雷达阵列(12个)");}void buildComputeUnit() override {config_->setComputeUnit("NVIDIA Orin X 2×");}void buildAlgorithmParams() override {config_->setAlgorithmParam("感知频率", 30.0f);config_->setAlgorithmParam("定位精度", 0.01f);config_->setAlgorithmParam("最大预测距离", 150.0f);}
};// 经济型配置建造者
class EconomyBuilder : public ConfigBuilder {
public:void reset() override {config_ = std::make_unique<VehicleConfig>();}void buildSensors() override {config_->addSensor("64线激光雷达");config_->addSensor("200万像素单目相机");config_->addSensor("常规毫米波雷达");config_->addSensor("超声波雷达(8个)");}void buildComputeUnit() override {config_->setComputeUnit("华为MDC 610");}void buildAlgorithmParams() override {config_->setAlgorithmParam("感知频率", 15.0f);config_->setAlgorithmParam("定位精度", 0.1f);config_->setAlgorithmParam("最大预测距离", 100.0f);}
};// ---------------------------- 指导者类 ----------------------------
class ConfigDirector {
public:void setBuilder(ConfigBuilder* builder) {builder_ = builder;}void constructStandardConfig() {builder_->reset();builder_->buildSensors();builder_->buildComputeUnit();builder_->buildAlgorithmParams();}void constructCustomConfig(bool high_end_sensor) {builder_->reset();if(high_end_sensor) {builder_->buildSensors();} else {// 自定义传感器配置...}builder_->buildComputeUnit();builder_->buildAlgorithmParams();}private:ConfigBuilder* builder_ = nullptr;
};// ---------------------------- 客户端使用 ----------------------------
int main() {ConfigDirector director;// 构建豪华型配置LuxuryBuilder luxury_builder;director.setBuilder(&luxury_builder);director.constructStandardConfig();auto luxury_config = luxury_builder.getResult();luxury_config->display();// 构建经济型配置EconomyBuilder economy_builder;director.setBuilder(&economy_builder);director.constructStandardConfig();auto economy_config = economy_builder.getResult();economy_config->display();// 构建自定义配置director.setBuilder(&luxury_builder);director.constructCustomConfig(true);auto custom_config = luxury_builder.getResult();custom_config->display();return 0;
}

代码解析

1. 产品类设计
class VehicleConfig { /*...*/ };
  • 配置存储:使用容器存储传感器列表和算法参数
  • 显示方法:提供配置可视化接口
2. 建造者体系
class ConfigBuilder { /*...*/ };  // 抽象接口
class LuxuryBuilder : public ConfigBuilder { /*...*/ }; // 具体实现
  • 分步构建:明确划分传感器、计算单元、算法参数配置步骤
  • 灵活扩展:新增配置类型只需添加新建造者
3. 指导者类
class ConfigDirector { /*...*/ };
  • 构建流程控制:封装标准配置流程
  • 支持自定义:提供特殊配置流程接口

运行结果

=== 车辆配置详情 ===
传感器系统:- 128线激光雷达- 800万像素双目相机- 4D毫米波雷达- 超声波雷达阵列(12个)计算单元:NVIDIA Orin X 2×算法参数:感知频率 = 30定位精度 = 0.01最大预测距离 = 150=== 车辆配置详情 ===
传感器系统:- 64线激光雷达- 200万像素单目相机- 常规毫米波雷达- 超声波雷达(8个)计算单元:华为MDC 610算法参数:感知频率 = 15定位精度 = 0.1最大预测距离 = 100=== 车辆配置详情 ===
...(自定义配置输出)

模式优势分析

在自动驾驶中的价值
  1. 配置灵活性

    • 支持快速切换不同配置方案(豪华型/经济型/测试型)
    • 允许部分配置覆盖(如仅升级传感器套件)
  2. 构建过程可控

    • 确保必要配置项完整(如必须包含定位传感器)
    • 支持配置参数校验
  3. 代码可维护性

    • 隔离复杂配置逻辑与业务代码
    • 新增配置类型不影响现有系统

扩展改进建议

1. 配置校验机制
void validateConfig() {if (sensors_.empty()) {throw std::runtime_error("必须配置至少一个传感器");}// 其他校验规则...
}
2. 配置持久化
void saveToFile(const std::string& path) {// 将配置保存为JSON/YAML文件
}
3. 动态配置加载
class DynamicBuilder : public ConfigBuilder {void buildSensors() override {// 从配置文件加载传感器配置}
};

建造者模式总结

核心价值

  • 分步构建复杂配置对象
  • 隔离构建过程与最终表示
  • 支持多种配置变体生成

适用场景

  • 自动驾驶车辆多版本配置管理
  • 测试场景参数组合生成
  • 动态系统参数包构建

本实现展示了建造者模式在自动驾驶配置管理中的典型应用,通过将复杂配置对象的构建过程模块化,为创建灵活可扩展的自动驾驶系统提供了可靠的架构支持。该模式是构建复杂参数化系统的关键设计手段,特别适合需要支持多配置方案的自动驾驶开发场景。

相关文章:

  • C++(初阶)(十二)——stack和queue
  • container_memory_working_set_bytes` 与 `container_memory_usage_bytes` 的区别
  • C++ 学习指南
  • Redis 处理读请求
  • 安全文件共享实际上是什么样的呢?
  • 解决找不到字体的问题
  • windows搭建xwiki17服务器
  • [Java · 铢积寸累] 数据结构 — 数组类型 - Arrays 工具类详解
  • 稳定PCDN运营效率
  • 【leetcode100】零钱兑换Ⅱ
  • 物联网赋能玻璃制造业:实现设备智能管理与生产协同
  • Ubuntu 上安装 Conda
  • 安装 Conda 环境
  • csv数据的写入
  • SharpMap与TerraLib:C#与C++开源GIS库
  • 蓝桥杯算法实战分享:C/C++ 题型解析与实战技巧
  • 【“星睿O6”AI PC开发套件评测】GPU矩阵指令算力,GPU带宽和NPU算力测试
  • npm i 出现permission denied
  • AtCoder 第402场初级竞赛 A~E题解
  • JavaScript 渲染内容爬取实践:Puppeteer 进阶技巧
  • 瞭望:高校大门要向公众打开,不能让“一关了之”成为常态
  • 创单次出舱活动时长世界纪录,一组数据盘点神十九乘组工作成果
  • IMF将今年全球经济增长预期由3.3%下调至2.8%
  • 翁东华卸任文和友小龙虾公司董事,此前抢镜“甲亢哥”惹争议
  • 上海与丰田汽车签署战略合作协议,丰田独资设立的雷克萨斯项目正式落地
  • 这5种走路姿势,藏着疾病秘密,第2种你可能也有