OpenBMC中工廠模式的簡明工作流程解析

本文將以最簡單直接的方式,從零開始講解OpenBMC中工廠模式的完整工作流程,包括從設計到使用的全生命周期。

1. 工廠模式最簡示例

我們先從一個最基礎的工廠模式實現開始:

// 產品接口
class GpioPin {
public:virtual void setValue(bool value) = 0;virtual ~GpioPin() = default;
};// 具體產品A
class AspeedGpio : public GpioPin {
public:void setValue(bool value) override {std::cout << "Aspeed GPIO set to " << value << std::endl;}
};// 具體產品B
class SysfsGpio : public GpioPin {
public:void setValue(bool value) override {std::cout << "Sysfs GPIO set to " << value << std::endl;}
};// 簡單工廠
class GpioFactory {
public:static std::unique_ptr<GpioPin> create(const std::string& type) {if (type == "aspeed") {return std::make_unique<AspeedGpio>();} else {return std::make_unique<SysfsGpio>();}}
};

2. 完整工作流程(從創建到使用)

步驟1:定義產品接口

首先確定需要創建的對象類型和公共接口

// 定義所有GPIO操作必須實現的接口
class GpioPin {
public:virtual void setDirection(Direction dir) = 0;virtual bool getValue() = 0;virtual void setValue(bool value) = 0;virtual ~GpioPin() = default;
};

步驟2:實現具體產品

為每個平臺或類型創建具體實現

// Aspeed平臺專用實現
class AspeedGpio : public GpioPin {void setValue(bool value) override {// 直接操作Aspeed芯片寄存器reg_write(ASPEED_GPIO_REG, value);}// 其他接口實現...
};// 通用sysfs實現
class SysfsGpio : public GpioPin {void setValue(bool value) override {// 通過Linux sysfs接口操作std::ofstream file("/sys/class/gpio/gpioX/value");file << (value ? "1" : "0");}// 其他接口實現...
};

步驟3:創建工廠類

實現決定創建哪種產品的邏輯

class GpioFactory {
public:static std::unique_ptr<GpioPin> create() {// 通過編譯選項或運行時檢測決定使用哪種實現#ifdef USE_ASPEED_GPIOreturn std::make_unique<AspeedGpio>();#elsereturn std::make_unique<SysfsGpio>();#endif}
};

步驟4:客戶端使用

其他代碼通過工廠獲取產品實例

// 在需要GPIO的地方
void controlLed() {// 通過工廠創建GPIO實例auto ledPin = GpioFactory::create();// 使用統一接口操作,不關心具體實現ledPin->setValue(true);std::this_thread::sleep_for(1s);ledPin->setValue(false);
}

3. 工廠模式的生命周期

階段1:設計期

  1. 分析需要創建哪些類型的對象
  2. 提取公共接口形成抽象產品類
  3. 為每個具體類型實現產品接口

階段2:編譯期

  1. 工廠類根據編譯選項(如USE_ASPEED_GPIO)
  2. 確定包含哪些具體實現
  3. 生成平臺特定的工廠實現

階段3:運行時

  1. 客戶端調用工廠創建方法
  2. 工廠實例化具體產品對象
  3. 返回產品基類指針/引用
  4. 客戶端通過基類接口使用產品

階段4:銷毀期

  1. 產品超出作用域自動銷毀(智能指針)
  2. 或顯式調用delete釋放資源

4. OpenBMC真實案例流程

以創建傳感器為例的完整工作流:

// 1. 定義傳感器接口
class Sensor {
public:virtual double readValue() = 0;virtual ~Sensor() = default;
};// 2. 實現具體傳感器
class TemperatureSensor : public Sensor {double readValue() override {// 實際讀取硬件溫度值return read_hw_register(0x2A);}
};class FanSpeedSensor : public Sensor {double readValue() override {// 讀取風扇轉速return read_fan_rpm();}
};// 3. 創建傳感器工廠
class SensorFactory {
public:static std::unique_ptr<Sensor> create(const std::string& type) {if (type == "temp") {return std::make_unique<TemperatureSensor>();} else if (type == "fan") {return std::make_unique<FanSpeedSensor>();}return nullptr;}
};// 4. 系統初始化時注冊傳感器
void initSensors() {auto& sensorManager = SensorManager::getInstance();sensorManager.addSensor("cpu_temp", SensorFactory::create("temp"));sensorManager.addSensor("fan1", SensorFactory::create("fan"));
}// 5. 其他模塊使用傳感器
void checkTemperature() {auto tempSensor = SensorManager::getInstance().getSensor("cpu_temp");if (tempSensor->readValue() > 80.0) {triggerCooling();}
}

5. 工廠模式的關鍵優勢

  1. 創建與使用分離:客戶端不需要知道具體實現類
  2. 易于擴展:添加新類型只需新增產品類并修改工廠
  3. 統一管理:集中控制對象創建過程
  4. 平臺無關:通過工廠隔離平臺特定代碼

6. 何時使用工廠模式

在OpenBMC中遇到以下情況時考慮使用工廠模式:

  1. 需要創建不同平臺(Aspeed/Nuvoton)的硬件操作類
  2. 系統需要支持多種實現方式(如sysfs/直接寄存器訪問)
  3. 對象創建過程復雜或需要統一管理
  4. 希望隔離具體實現類與客戶端代碼

通過這個簡明的流程說明,應該能夠清晰理解工廠模式在OpenBMC中從設計到使用的完整生命周期。工廠模式的核心思想其實很簡單:定義一個創建對象的接口,但讓子類決定實例化哪個類

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95254.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95254.shtml

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

相關文章

解決:Error updating changes: detected dubious ownership in repository at

在通過 Git Bash 提交項目代碼時輸入 git add . 命令后&#xff0c;報錯&#xff1a;Error updating changes: detected dubious ownership in repository at ...這是因為 該項目的所有者 與 現在的用戶 不一致 比如說&#xff1a; 該項目的所有者是 Administrator&#xff0c;…

DataEase V2 社區版安裝部署

參考&#xff1a;使用外置 MySQL 部署 DataEase v2 - FIT2CLOUD 知識庫 一、下載安裝包 開源社區 - FIT2CLOUD 飛致云 選擇社區版下載 下載后上傳到 linux 的目錄 &#xff08;要求至少200G&#xff09; 二、在MySQL8中創建數據庫 # 創建DataEase庫 CREATE DATABASE datae…

nginx高性能web服務器

web服務基礎介紹 一、Web服務核心流程 #mermaid-svg-NCj4hbRIvvgMXmcK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NCj4hbRIvvgMXmcK .error-icon{fill:#552222;}#mermaid-svg-NCj4hbRIvvgMXmcK .error-text{fil…

_init__.py的作用

目錄 場景1:沒有 `__init__.py` 的情況 場景2:有 `__init__.py` 并導入模塊 場景3:用 `__all__` 定義"推薦工具" 注意:工具箱內部的工具互相調用 情況1:在 `__init__.py` 中導入模塊 情況2:在 `__init__.py` 中直接導入模塊里的功能 關鍵原則 在 Python 中,__…

瀏覽器面試題及詳細答案 88道(12-22)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

開發避坑指南(23):Tomcat高版本URL特殊字符限制問題解決方案(RFC 7230 RFC 3986)

異常信息 java.lang.IllegalArgumentException: 在請求目標中找到無效字符[/order/show?orderType01&orderTitle0xe50x8f0xa30xe50xb20xb80xe50x8a0xa80xe60x800x81&pageNum1 ]。有效字符在RFC 7230和RFC 3986中定義org.apache.coyote.http11.Http11InputBuffer.parse…

HTTPS的應用層協議

HTTPS的應用層協議 方案 5 - 非對稱加密 對稱加密 證書認證 在客戶端和服務器剛一建?連接的時候, 服務器給客戶端返回一個 證書&#xff0c;證書包含了之前服務端的公鑰, 也包含了網站的身份信息. 客戶端進行認證 當客戶端獲取到這個證書之后, 會對證書進行校驗(防止證書是偽…

【SpringBoot】05 容器功能 - SpringBoot底層注解的應用與實戰 - @Configuration + @Bean

文章目錄前言一、創建兩個組件二、使用傳統方式源代碼解釋三、使用SpringBoot方法源代碼解釋四、查看是否添加到組件中查看自定義組件名配置類在容器中注冊的是單實例組件配置類本身也是容器中的一個組件Configuration的proxyBeanMethods屬性&#xff1a;代理bean的方法proxyBe…

c#聯合Halcon進行OCR字符識別(含halcon-25.05 百度網盤)

1.下載安裝halcon 通過網盤分享的文件&#xff1a;halcon-25.05.0.0-x64-win64 鏈接: https://pan.baidu.com/s/1XAx-8ZQM-ZHkgHIc-dhCYw 提取碼: whek 2.c#環境配置 創建test_halcon_ocr項目 找到halcon的安裝路徑 我的&#xff1a; D:\halcon\HALCON-25.05-Progress\bin\x64…

絲桿支撐座怎樣助力升降設備實現智能化?

絲桿支撐座作為傳動系統中的關鍵支撐部件&#xff0c;憑借其高剛性、抗沖擊及精準定位能力&#xff0c;廣泛應用于重型機械與升降設備領域&#xff0c;為設備提供穩定可靠的軸向承載與徑向支撐&#xff0c;確保高負荷工況下的安全運行。電梯 / 升降平臺&#xff1a;液壓電梯的輔…

Notta:高效智能的音頻轉文字工具

本文轉載自&#xff1a;Notta&#xff1a;高效智能的音頻轉文字工具 - Hello123 ** 一、產品簡介 Notta 是一款基于 AI 語音識別引擎的語音轉文字工具&#xff0c;支持 58 種語言的轉錄和 42 種語言的翻譯。用戶可通過實時錄音或上傳音頻 / 視頻文件&#xff08;如 MP3、WAV …

Docker私有倉庫創建及Docky存儲與網絡配置(小白的“升級打怪”成長之路)

目錄 一、Docker私有倉庫創建 1、在一臺安裝Docker私有倉庫的主機上添加docker-compose 命令 2、安裝docker-ce服務 3、Docker 鏡像加速 4、安裝Harbor倉庫 5、使用腳本安裝倉庫 6、網站登陸 7、客戶端使用Harbor倉庫 二、Docky存儲與網絡配置 1、存儲與網絡 掛載主機…

谷歌ADK接入文件操作MCP

文章目錄MCP基礎概念文件操作服務器文件操作MCP接入谷歌ADK項目創建多輪對話代碼MCP基礎概念 MCP技術體系中&#xff0c;會將外部工具運行腳本稱作服務器&#xff0c;而接入這些外部工具的大模型運行環境稱作客戶端。 一個客戶端可以接入多個不同類型的服務器&#xff0c;但都…

高光譜技術的獨特優勢

高光譜技術憑借其?納米級連續光譜采集能力?和?圖譜合一的探測模式?&#xff0c;在多個領域展現出不可替代的獨特優勢&#xff1a;一、光譜維度&#xff1a;精細物質指紋識別?納米級連續光譜解析? 通過 ?5-10nm帶寬的數百個連續波段?&#xff08;最高330個通道&#xff…

基于Vue+Element UI集成高德地圖的完整實踐指南

本次開發使用deepseek 簡直如虎添翼得心應手 生成模擬數據、解決報錯那真是嘎嘎地 在 Vue Element UI 項目中引入高德地圖 具體實現步驟&#xff1a; 高德開放平臺&#xff1a;注冊賬號 → 進入控制臺 → 創建應用 → 獲取 Web端(JS API)的Key https://lbs.amap.com/ 這里需要…

Day50--圖論--98. 所有可達路徑(卡碼網),797. 所有可能的路徑

Day50–圖論–98. 所有可達路徑&#xff08;卡碼網&#xff09;&#xff0c;797. 所有可能的路徑 刷今天的內容之前&#xff0c;要先去《代碼隨想錄》網站&#xff0c;先看完&#xff1a;圖論理論基礎和深度優先搜索理論基礎。做完之后可以看題解。有余力&#xff0c;把廣度優先…

Python 異常捕獲

一、獲取未知錯誤try:# 相關處理邏輯 異常后面輸出print(輸入信息……) except Exception as e:print(未知錯誤,e)二、獲取已知錯誤except 錯誤單詞&#xff08;來源于錯誤信息的第一個單詞&#xff09;多個已知錯誤使用 except XXXXX:try:# 相關處理邏輯 異常后面輸出print…

RIOT、RT-Thread 和 FreeRTOS 是三種主流的實時操作系統

RIOT、RT-Thread 和 FreeRTOS 是三種主流的實時操作系統&#xff08;RTOS&#xff09;&#xff0c;專為嵌入式系統和物聯網&#xff08;IoT&#xff09;設備設計。它們在架構、功能、生態和應用場景上有顯著差異&#xff0c;以下是詳細對比&#xff1a;1. 架構與設計理念特性RI…

【FAQ】Win11創建資源不足繞開微軟賬號登錄

Win11安裝資源限制 因為 Windows 11 有兩項強制檢測 VMware 8 默認沒提供&#xff1a; TPM 2.0&#xff08;可信平臺模塊&#xff09;Secure Boot&#xff08;安全啟動&#xff09; 一步到位解決辦法&#xff08;官方兼容方式&#xff09; 關閉虛擬機電源編輯虛擬機設置 選項 →…

Docker使用----(安裝_Windows版)

一、Docker Docker 鏡像就像是一個軟件包&#xff0c;里面包括了應用程序的代碼、運行所需的庫和工具、配置文件等等&#xff0c;所有這些都打包在一起&#xff0c;以確保應用程序在不同的計算機上運行時&#xff0c;都能保持一致性。 可以把 Docker 鏡像想象成一個軟件安裝文件…