模式定義
工廠方法模式(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();// 切換備用傳感器工廠
}
工廠方法模式總結
核心價值:
- 將對象創建與使用分離,符合單一職責原則
- 提高系統可擴展性,新增產品類型無需修改已有代碼
適用場景:
- 需要支持多類型傳感器的自動駕駛系統
- 需要靈活替換不同品牌傳感器的車規平臺
- 需要統一管理傳感器生命周期的中間件
通過本實現可以看出,工廠方法模式為自動駕駛感知系統的傳感器管理提供了優雅的架構解決方案,是構建可擴展、易維護的自動駕駛系統的重要設計手段。