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

模式定义

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,通过定义抽象工厂接口将对象创建过程延迟到子类实现,实现对象创建与使用的解耦。该模式特别适合需要动态扩展产品类型的场景。


自动驾驶感知场景分析

自动驾驶感知系统需要集成多种传感器:

  • 激光雷达(LiDAR):3D点云数据采集
  • 摄像头(Camera):2D图像数据采集
  • 毫米波雷达(Radar):运动目标检测
  • 超声波传感器(Ultrasonic):近距离障碍物检测

我们将通过工厂方法实现不同传感器的统一创建管理。


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

cpp 复制代码
#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. 产品体系设计
cpp 复制代码
class Sensor { /*...*/ };       // 抽象产品
class LiDAR : public Sensor { /*...*/ };  // 具体产品
class Camera : public Sensor { /*...*/ }; // 具体产品
  • Sensor基类:定义传感器通用接口(初始化、数据采集、处理)
  • 具体传感器:实现特定传感器逻辑,可携带专有参数(如扫描频率)
2. 工厂体系实现
cpp 复制代码
class SensorFactory { /*...*/ };       // 抽象工厂
class LiDARFactory : public SensorFactory { /*...*/ }; // 具体工厂
  • 工厂基类 :声明createSensor()工厂方法
  • 具体工厂
    • 持有产品创建所需参数
    • 实现具体产品创建逻辑
    • 可添加工厂级预处理(如配置验证)
3. 系统集成
cpp 复制代码
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. 动态配置加载
cpp 复制代码
// 通过配置文件创建工厂
std::unique_ptr<SensorFactory> createFactoryFromConfig(
    const json& config) 
{
    if(config["type"] == "LiDAR") {
        return std::make_unique<LiDARFactory>(
            config["frequency"]);
    }
    // 其他类型处理...
}
2. 复合传感器支持
cpp 复制代码
class SensorClusterFactory : public SensorFactory {
    std::vector<std::unique_ptr<Sensor>> createSensor() override {
        // 创建多个传感器组成集群
    }
};
3. 异常处理增强
cpp 复制代码
try {
    sensor->initialize();
} catch (const SensorException& e) {
    std::cerr << "传感器初始化失败: " << e.what();
    // 切换备用传感器工厂
}

工厂方法模式总结

核心价值

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

适用场景

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

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

相关推荐
Hello eveybody28 分钟前
C++按位与(&)、按位或(|)和按位异或(^)
开发语言·c++
被AI抢饭碗的人39 分钟前
c++:c++中的输入输出(二)
开发语言·c++
a东方青1 小时前
vue3学习笔记之属性绑定
vue.js·笔记·学习
lqqjuly1 小时前
C++ 面向对象关键语法详解:override、虚函数、转发调用和数组引用传参-策略模式
开发语言·c++
光头小小强0071 小时前
致远OA——自定义开发rest接口
java·经验分享·spring·tomcat
EstrangedZ1 小时前
vcpkg缓存问题研究
c语言·c++·缓存·cmake·vcpkg
嵌入式DZC1 小时前
MCGS昆仑通太屏笔记
笔记
周Echo周1 小时前
16、堆基础知识点和priority_queue的模拟实现
java·linux·c语言·开发语言·c++·后端·算法
豆豆1 小时前
day28 学习笔记
图像处理·笔记·opencv·学习·计算机视觉
下雨的清晨2 小时前
计算机网络期中复习笔记(自用)
笔记·计算机网络·课程设计