Linux 下 C 語言實現工廠模式

Linux 下 C 語言實現工廠模式:設計理念與實戰

    • 🧠 一、工廠模式簡介
      • 什么是工廠模式?
      • C 語言實現設計模式的挑戰
    • 🏗? 二、實現簡單工廠模式(Simple Factory)
      • 1. 定義傳感器接口(device.h)
      • 2. 各類型傳感器實現(sensor_temp.c / sensor_humidity.c)
        • 溫度傳感器
        • 濕度傳感器
      • 3. 定義工廠接口(factory.h / factory.c)
        • factory.h
        • factory.c
      • 4. 使用工廠的主函數(main.c)
    • 🧪 三、Linux 應用場景舉例
      • 用戶空間:
      • 內核空間類比:
    • 🧰 四、進階設計:注冊表式工廠(更靈活)
    • 🧠 五、總結
    • 🔗 六、參考資料

在嵌入式開發和系統編程中,良好的架構設計 能有效提升代碼的可維護性、可擴展性。雖然 C 語言不是面向對象語言,但通過結構體與函數指針等手段,我們依然可以實現經典的設計模式。本文將深入講解如何在 Linux 環境下使用 C 語言實現工廠模式(Factory Pattern),并結合實際案例說明其優勢與應用場景。

🧠 一、工廠模式簡介

什么是工廠模式?

工廠模式是一種創建型設計模式,用于隱藏對象創建邏輯,將實例化過程交由工廠類負責。調用者只關心產品的“接口”,不關心具體實現,從而實現解耦。

C 語言實現設計模式的挑戰

  • 沒有類和繼承
  • 無多態機制
  • 類型系統不如 C++ 靈活

解決辦法:

  • 使用 struct 模擬類
  • 使用函數指針模擬方法
  • 使用枚舉/注冊表實現工廠分發

🏗? 二、實現簡單工廠模式(Simple Factory)

我們以“不同類型的傳感器”為例,定義一個統一的設備接口,由工廠創建不同的傳感器對象。

1. 定義傳感器接口(device.h)

#ifndef DEVICE_H
#define DEVICE_Htypedef struct Device {void (*init)(void);void (*read)(void);void (*destroy)(struct Device* self);
} Device;#endif

2. 各類型傳感器實現(sensor_temp.c / sensor_humidity.c)

溫度傳感器
#include <stdio.h>
#include <stdlib.h>
#include "device.h"static void temp_init() {printf("溫度傳感器初始化完成\n");
}static void temp_read() {printf("溫度傳感器讀取數據:25°C\n");
}Device* create_temp_sensor() {Device* dev = (Device*)malloc(sizeof(Device));dev->init = temp_init;dev->read = temp_read;dev->destroy = free;return dev;
}
濕度傳感器
#include <stdio.h>
#include <stdlib.h>
#include "device.h"static void humidity_init() {printf("濕度傳感器初始化完成\n");
}static void humidity_read() {printf("濕度傳感器讀取數據:60%%\n");
}Device* create_humidity_sensor() {Device* dev = (Device*)malloc(sizeof(Device));dev->init = humidity_init;dev->read = humidity_read;dev->destroy = free;return dev;
}

3. 定義工廠接口(factory.h / factory.c)

factory.h
#ifndef FACTORY_H
#define FACTORY_H#include "device.h"typedef enum {SENSOR_TEMP,SENSOR_HUMIDITY
} SensorType;Device* sensor_factory_create(SensorType type);#endif
factory.c
#include "factory.h"extern Device* create_temp_sensor();
extern Device* create_humidity_sensor();Device* sensor_factory_create(SensorType type) {switch (type) {case SENSOR_TEMP:return create_temp_sensor();case SENSOR_HUMIDITY:return create_humidity_sensor();default:return NULL;}
}

4. 使用工廠的主函數(main.c)

#include <stdio.h>
#include "factory.h"int main() {Device* sensor1 = sensor_factory_create(SENSOR_TEMP);Device* sensor2 = sensor_factory_create(SENSOR_HUMIDITY);if (sensor1) {sensor1->init();sensor1->read();sensor1->destroy(sensor1);}if (sensor2) {sensor2->init();sensor2->read();sensor2->destroy(sensor2);}return 0;
}

🧪 三、Linux 應用場景舉例

用戶空間:

  • 日志模塊封裝:使用工廠返回 file_logger / syslog_logger / udp_logger
  • 插件加載器:通過配置動態加載插件創建函數指針并注冊

內核空間類比:

  • platform_driver 機制of_device_id 表現類似“注冊表+工廠”
  • probe 函數中的創建與注冊過程 模擬工廠動態創建驅動實例

🧰 四、進階設計:注冊表式工廠(更靈活)

typedef struct {SensorType type;Device* (*create_func)(void);
} SensorRegistryEntry;static SensorRegistryEntry registry[] = {{ SENSOR_TEMP, create_temp_sensor },{ SENSOR_HUMIDITY, create_humidity_sensor },
};Device* sensor_factory_create(SensorType type) {for (int i = 0; i < sizeof(registry)/sizeof(registry[0]); ++i) {if (registry[i].type == type) {return registry[i].create_func();}}return NULL;
}

這種寫法易于擴展,只需新增注冊項。

🧠 五、總結

  • 工廠模式是創建型設計模式的典型代表,適用于對象種類較多、結構相似的場景。
  • 在 C 語言中可以通過結構體+函數指針靈活模擬面向對象思想。
  • 工廠模式可以大大降低模塊之間的耦合性,使系統更易于維護和擴展。

🔗 六、參考資料

  • 《設計模式:可復用面向對象軟件的基礎》
  • 《Linux 設備驅動開發詳解》
  • 見附件示例代碼

    https://download.csdn.net/download/yll7702/90919839

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

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

相關文章

用 Appuploader,讓 iOS 上架流程真正“可交接、可記錄、可復用”:我們是這樣實現的

你可能聽說過這樣一類人&#xff1a;上線必找他&#xff0c;證書只有他有&#xff0c;Transporter 密碼在他電腦上&#xff0c;描述文件什么時候過期&#xff0c;只有他知道。 如果你團隊里有這樣一位“發布大師”&#xff0c;他可能是個英雄——但也是個單點風險源。 我們團…

工控機安裝lubuntu系統

工控機安裝lubuntu系統指南手冊 1. 準備 1個8G左右的U盤 下載Rufus&#xff1a; Index of /downloads 下載lubuntu系統鏡像&#xff1a; NJU Mirror Downloads – Lubuntu 下載Ventoy工具&#xff1a; Releases ventoy/Ventoy GitHub 下載后&#xff0c;解壓&#…

MAC上怎么進入隱藏目錄

在Mac上&#xff0c;由于系統保護的原因&#xff0c;一些系統目錄如/usr默認是隱藏的&#xff0c;但可以通過以下方法進入&#xff1a; 方法一&#xff1a;使用Finder的“前往文件夾”功能 打開Finder。使用快捷鍵Command Shift G&#xff0c;或者在菜單欄中選擇“前往”-“…

流媒體基礎解析:視頻清晰度的關鍵因素

在視頻處理的過程中&#xff0c;編碼解碼及碼率是影響視頻清晰度的關鍵因素。今天&#xff0c;我們將深入探討這些概念&#xff0c;并解析它們如何共同作用于視頻質量。 編碼解碼概述 編碼&#xff0c;簡單來說&#xff0c;就是壓縮。視頻編碼的目的是將原始視頻數據壓縮成較…

tomcat服務器以及接受請求參數的方式

1.javaee&#xff1a;意為java企業版&#xff0c;指java企業級開發的規范總和&#xff0c;包含13項技術規范 2.事實上服務器和客戶端進行交互的過程中&#xff0c;有一個前端控制器在中間運作&#xff0c;這個控制器為DispatcherServlet&#xff0c;它負責將客戶端請求的信息包…

武警智能兵器室系統架構設計與關鍵技術解析

在現代化武警部隊建設中&#xff0c;武器彈藥的安全管理與快速響應能力直接影響部隊戰斗力。本文基于某實戰化智能兵器室建設案例&#xff0c;深入解析其系統架構設計、關鍵技術實現及創新管理機制&#xff0c;為安防領域提供可借鑒的解決方案。 整體拓撲結構 系統采用分層分布…

RLHF獎勵模型的訓練

由于 RLHF 的訓練過程中需要依賴大量的人類偏好數據進行學習&#xff0c;因此很難在訓練過程中要求人類標注者實時提供偏好反饋。為此&#xff0c;我們需要訓練一個模型來替代人類在 RLHF 訓練過程中實時提供反饋&#xff0c;這個模型被稱為獎勵模型 &#x1f538;一、 目標函…

reverse_ssh 建立反向 SSH 連接指南 混淆AV [好東西喲]

目錄 &#x1f310; 工具簡介 ?? 前提條件 攻擊主機 (Linux) 目標主機 (Windows) &#x1f4cb; 詳細步驟 步驟 1&#xff1a;安裝 Go 環境 步驟 2&#xff1a;安裝必要依賴 步驟 3&#xff1a;下載并編譯 reverse_ssh 步驟 4&#xff1a;配置密鑰 步驟 5&#xff…

Ubuntu 下搭建ESP32 ESP-IDF開發環境,并在windows下用VSCode通過SSH登錄Ubuntu開發ESP32應用

Ubuntu 下搭建ESP32 ESP-IDF開發環境&#xff0c;網上操作指南很多&#xff0c;本來一直也沒有想過要寫這么一篇文章。因為我其實不太習慣在linux下開發應用&#xff0c;平時更習慣windows的軟件操作&#xff0c;只是因為windows下開發ESP32的應用編譯時太慢&#xff0c;讓人受…

Rust使用Cargo構建項目

文章目錄 你好&#xff0c;Cargo&#xff01;驗證Cargo安裝使用Cargo創建項目新建項目配置文件解析默認代碼結構 Cargo工作流常用命令速查表詳細使用說明1. 編譯項目2. 運行程序3.快速檢查4. 發布版本構建 Cargo的設計哲學約定優于配置工程化優勢 開發建議1. 新項目初始化?2. …

免費且好用的PDF水印添加工具

軟件介紹 琥珀掃描.zip下載鏈接&#xff1a;https://pan.quark.cn/s/3a8f432b29aa 今天要給大家推薦一款超實用的PDF添加水印工具&#xff0c;它能夠滿足用戶給PDF文件添加水印的需求&#xff0c;而且完全免費。 這款PDF添加水印的軟件有著簡潔的界面&#xff0c;操作簡便&a…

NW969NW978美光閃存顆粒NW980NW984

NW969NW978美光閃存顆粒NW980NW984 技術解析&#xff1a;NW969、NW978、NW980與NW984的架構創新 美光&#xff08;Micron&#xff09;的閃存顆粒系列&#xff0c;尤其是NW969、NW978、NW980和NW984&#xff0c;代表了存儲技術的前沿突破。這些產品均采用第九代3D TLC&#xf…

Mysql常用知識3:Kafka和數據庫優化

文章目錄 一、分布式消息系統&#xff08;Kafka相關問題5-10&#xff09;5. Kafka如何保證消息不丟失&#xff1f;6. 項目中Kafka具體怎么使用的&#xff1f;7. 消息異常未發送成功怎么解決&#xff1f;8. 重試具體怎么做的&#xff0c;循環嗎&#xff1f;9. 重試多次失敗怎么辦…

常見的RAG文檔解析輔助工具匯總及企業選型思考

以下當前比較知名的RAG的文檔解析輔助工具的開源項目匯總&#xff0c;包含核心功能、License信息及GitHub地址&#xff1a; 1. RAGFlow 核心功能&#xff1a;支持PDF/掃描件/CAD等23種格式解析&#xff0c;OCR準確率98%&#xff0c;知識圖譜融合&#xff0c;混合檢索&#xf…

基于Sqoop的MySQL-Hive全量/增量同步解決方案(支持多表批量處理

一、全量同步方案設計 1.1 基礎命令模板 sqoop import \ --connect jdbc:mysql://mysql_host:3306/db_name \ --username user \ --password pass \ --table source_table \ --hive-import \ --hive-table target_table \ --hive-overwrite \ # 覆蓋已有表 --num-mappers 8 …

前端學習(7)—— HTML + CSS實現博客系統頁面

目錄 一&#xff0c;效果展示 二&#xff0c;實現博客列表頁 2.1 實現導航欄 2.2 實現個人信息 2.3 實現博客列表 三&#xff0c;實現博客正文頁 3.2 復用 3.4 實現博客正文 四&#xff0c;實現博客登錄頁 4.1 版心 4.2 登錄框 五&#xff0c;實現博客編輯頁 5.1 …

【技能拾遺】——家庭寬帶單線復用布線與配置(移動2025版)

&#x1f4d6; 前言&#xff1a;在家庭網絡拓撲中&#xff0c;客廳到弱電箱只預埋了一根網線&#xff0c;由于已將廣電的有線電視取消并改用IPTV。現在需要解決在客廳布置路由器和觀看IPTV問題&#xff0c;這里就用到單線復用技術。 目錄 &#x1f552; 1. 拓撲規劃&#x1f55…

VTK|實現類似CloundCompare的測量功能

文章目錄 CloundCompare在點、線、面三種模式下的顯示內容? 圖1&#xff1a;點模式? 圖2&#xff1a;線模式? 圖3&#xff1a;面模式 增加控制菜單欄實現測量功能類如何調用項目git鏈接 CloundCompare在點、線、面三種模式下的顯示內容 點 線 面 三張圖展示了 CloudComp…

4000萬日訂單背后,餓了么再掀即時零售的“效率革命”

當即時零售轉向價值深耕&#xff0c;贏面就是綜合實力的強弱。 文&#xff5c;郭夢儀 編&#xff5c;王一粟 在硝煙彌漫的外賣行業“三國殺”中&#xff0c;餓了么與淘寶閃購的日訂單量竟然突破了4000萬單。 而距淘寶閃購正式上線&#xff0c;還不到一個月。 在大額福利優惠…

vedio.ontimeupdate()和video.onloadeddata()

video.onloadeddata &#xff08;&#xff09; video.onloadeddata 是 JavaScript 中用于監聽 HTML <video> 元素 「當前幀數據已加載」 的事件處理器。當視頻的第一幀畫面數據加載完成&#xff08;足以開始播放&#xff09;時&#xff0c;會觸發此事件。 1. 基本用法 …