工廠方法模式詳解及在自動駕駛場景代碼示例(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處理] 圖像特征提取/目標識別

模式優勢分析

在自動駕駛中的價值
  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.pswp.cn/web/76355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76355.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 S2SH 架構的企業車輛管理系統:設計、實現與應用

在企業運營中&#xff0c;車輛管理是一項重要工作。隨著企業規模的擴大&#xff0c;車輛數量增多&#xff0c;傳統管理方式效率低下&#xff0c;難以滿足企業需求。本文介紹的基于 S2SH 的企業車輛管理系統&#xff0c;借助現代化計算機技術&#xff0c;實現車輛、駕駛員和出車…

IntelliJ IDEA download JDK

IntelliJ IDEA download JDK 自動下載各個版本JDK&#xff0c;步驟 File - Project Structure &#xff08;快捷鍵 Ctrl Shift Alt S&#xff09; 如果下載失敗&#xff0c;換個下載站點吧。一般選擇Oracle版本&#xff0c;因為java被Oracle收購了 好了。 花里胡哨&#…

MCP協議在納米材料領域的深度應用:從跨尺度協同到智能研發范式重構

MCP協議在納米材料領域的深度應用&#xff1a;從跨尺度協同到智能研發范式重構 文章目錄 MCP協議在納米材料領域的深度應用&#xff1a;從跨尺度協同到智能研發范式重構一、MCP協議的技術演進與納米材料研究的適配性分析1.1 MCP協議的核心架構升級1.2 納米材料研發的核心挑戰與…

OpenAI發布GPT-4.1:開發者專屬模型的深度解析 [特殊字符]

最近OpenAI發布了GPT-4.1模型&#xff0c;卻讓不少人感到困惑。今天我們就來深入剖析這個新模型的關鍵信息&#xff01; 重要前提&#xff1a;API專屬模型 &#x1f4bb; 首先需要明確的是&#xff0c;GPT-4.1僅通過API提供&#xff0c;不會出現在聊天界面中。這是因為該模型主…

DemoGen:用于數據高效視覺運動策略學習的合成演示生成

25年2月來自清華、上海姚期智研究院和上海AI實驗室的論文“DemoGen: Synthetic Demonstration Generation for Data-Efficient Visuomotor Policy Learning”。 視覺運動策略在機器人操控中展現出巨大潛力&#xff0c;但通常需要大量人工采集的數據才能有效執行。驅動高數據需…

界面控件DevExpress WPF v25.1新功能預覽 - 文檔處理類功能升級

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

Muduo網絡庫實現 [十六] - HttpServer模塊

目錄 設計思路 類的設計 模塊的實現 公有接口 私有接口 疑問點 設計思路 本模塊就是設計一個HttpServer模塊&#xff0c;提供便攜的搭建http協議的服務器的方法。那么這個模塊需要如何設計呢&#xff1f; 這還需要從Http請求說起。 首先從http請求的請求行開始分析&…

多模態記憶融合:基于LSTM的連續場景生成——突破AI視頻生成長度限制

一、技術背景與核心挑戰 2025年視頻生成領域面臨的關鍵難題是長時程連貫性——傳統方法在生成超過5分鐘視頻時會出現場景跳變、物理規則不一致等問題。本研究提出時空記憶融合架構&#xff08;ST-MFA&#xff09;&#xff0c;通過LSTM記憶門控與多模態對齊技術&#xff0c;在R…

LabVIEW油氣井井下集成監測系統

LabVIEW平臺開發的油氣井井下集成監測系統通過實時監控油氣井的井下環境參數&#xff0c;如溫度、壓力和有害氣體含量&#xff0c;有效提高了油氣采收率并確保了作業安全。系統利用高精度傳感器和強大的數據處理能力&#xff0c;通過綜合監測和分析&#xff0c;實現了對油氣井環…

【python畫圖】:從入門到精通繪制完美柱狀圖

目錄 Python數據可視化&#xff1a;從入門到精通繪制完美柱狀圖一、基礎篇&#xff1a;快速繪制柱狀圖1.1 使用Matplotlib基礎繪制1.2 使用Pandas快速繪圖 二、進階篇&#xff1a;專業級柱狀圖定制2.1 多系列柱狀圖2.2 堆疊柱狀圖2.3 水平柱狀圖 三、專業參數速查表Matplotlib …

【 解決Cline插件無法激活及DeepSeek模型請求卡頓或者無法加載問題】

解決Cline插件無法激活及DeepSeek模型請求卡頓問題 問題描述 在VSCode中使用Cline插件時遇到以下問題&#xff1a; 插件長時間卡在"activating"激活狀態成功激活后發起DeepSeek對話時&#xff0c;API請求階段持續卡頓夜間時段問題出現頻率較低 環境信息 Cline版…

聊透多線程編程-線程互斥與同步-9.C# 線程互斥實現方式

目錄 1. 鎖機制 (Locking Mechanisms) (1) lock 關鍵字 (2) Monitor 類 2. 跨進程互斥機制 3. 信號量機制 (1) Semaphore 和 SemaphoreSlim 4. 讀寫鎖機制 (1) ReaderWriterLockSlim 5. 原子操作機制 (1) Interlocked 類 6. 自旋鎖機制 (1) SpinLock 線程互斥是一種…

eNSP無法啟動AR報錯碼40,而且按照eNSP幫助手冊排查都沒用,我的處理方法【自己存檔版】

問題&#xff1a; 已經嘗試過eNSP的幫助手冊&#xff0c;發現都沒用&#xff01; eNSP啟動AR設備報錯碼40且常規排查無效時&#xff0c;可嘗試以下解決方案&#xff08;按優先級排序&#xff09;&#xff1a; 1. 關閉Hyper-V和Windows沙盒&#xff08;我是這個問題&#xff0…

秒殺系統解決兩個核心問題的思路方法總結:1.庫存超賣問題;2.用戶重復搶購問題。

秒殺系統解決兩個核心問題 秒殺系統解決兩個核心問題&#xff1a;一、解決庫存超賣的核心邏輯&#xff1a;解釋&#xff1a;原子性保證&#xff1a; 二、如何避免重復搶購&#xff1a;使用 Redis 做唯一標識判斷優點&#xff1a; 三、流程完整梳理&#xff1a;四、通過數據庫建…

【集成電路版圖設計學習筆記】3.基本電路元件(MOS,電容,電阻)

一、MOSFET 在版圖設計中&#xff0c;要定義一個mosfet&#xff0c;最關鍵的層次是polysilicon&#xff08;多晶硅&#xff09;和active&#xff08;有源區&#xff09;。用有源區定義了一個矩形的區域&#xff0c;在這個區域內才可以形成一個有源器件&#xff0c;然后再用多晶…

藍橋杯之差分題型

一維差分 問題描述 給定一個長度為 nn 的序列 aa。 再給定 mm 組操作&#xff0c;每次操作給定 33 個正整數 l,r,dl,r,d&#xff0c;表示對 al~ral~r? 中的所有數增加 dd。 最終輸出操作結束后的序列 aa。 Update&#xff1a;由于評測機過快&#xff0c;n,mn,m 于 2024…

深入剖析 C/S 與 B/S 架構及網絡通信基礎

目錄 C/S 架構詳解? 概念與示例? 優點? B/S 架構詳解? 概念與示例? 優勢? 缺點? C/S 與 B/S 的區別? 架構組成? 使用場景? 開發和維護? 安全性? 網絡通信基礎? IP 地址? MAC&#xff08;物理地址&#xff09;? 端口? 路由器? 網關? 子網掩…

常見免殺框架的使用(3款)---【AniYaGUI1.2.0、AV_Evasion_Tool掩日、FoxBypass_V1.0】

一、AniYaGUI1.2.0免殺框架 環境&#xff1a;虛擬機Win10 、云服務器 工具&#xff1a;Xshell、CobaltStrike 項目下載地址&#xff1a; https://github.com/piiperxyz/AniYa 1. 安裝Go語言環境 確保Win10虛擬機安裝 Golang 且環境變量中包含 go 否則?法編譯&#xff08;注…

Apache HTTPD 換行解析漏洞

漏洞介紹 CVE-2017-15715 Apache HTTPD 是一個廣泛使用的 HTTP 服務器&#xff0c;可以通過 mod_php 模塊來運行 PHP 網頁。在其 2.4.0 到 2.4.29 版本中存在一個解析漏洞&#xff0c;當文件名以 1.php\x0A 結尾時&#xff0c;該文件會被按照 PHP 文件進行解析&#xff0c;這…

常用開發環境/工具版本選擇(持續更新中)

操作系統&#xff1a;Ubuntu Server Version&#xff08;LTS&#xff09;Latest Sub VerRelease Time24.04(Noble Numbat)24.04.22025-02-1622.04(Jammy Jellyfish)22.04.52024-09-1120.04(Focal Fossa)20.04.62023-03-1418.04(Bionic Beaver)18.04.62021-09-1516.04.7(Xenial…