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