Linux下C語言實現(xiàn)工廠模式方式
在嵌入式開發(fā)和系統(tǒng)編程中,良好的架構(gòu)設(shè)計 能有效提升代碼的可維護(hù)性、可擴(kuò)展性。雖然 C 語言不是面向?qū)ο笳Z言,但通過結(jié)構(gòu)體與函數(shù)指針等手段,我們依然可以實現(xiàn)經(jīng)典的設(shè)計模式。
本文將深入講解如何在 Linux 環(huán)境下使用 C 語言實現(xiàn)工廠模式(Factory Pattern),并結(jié)合實際案例說明其優(yōu)勢與應(yīng)用場景。
一、工廠模式簡介
什么是工廠模式?
工廠模式是一種創(chuàng)建型設(shè)計模式,用于隱藏對象創(chuàng)建邏輯,將實例化過程交由工廠類負(fù)責(zé)。
調(diào)用者只關(guān)心產(chǎn)品的“接口”,不關(guān)心具體實現(xiàn),從而實現(xiàn)解耦。
C 語言實現(xiàn)設(shè)計模式的挑戰(zhàn)
- 沒有類和繼承
- 無多態(tài)機(jī)制
- 類型系統(tǒng)不如 C++ 靈活
解決辦法:
- 使用
struct模擬類 - 使用函數(shù)指針模擬方法
- 使用枚舉/注冊表實現(xiàn)工廠分發(fā)
二、實現(xiàn)簡單工廠模式(Simple Factory)
我們以“不同類型的傳感器”為例,定義一個統(tǒng)一的設(shè)備接口,由工廠創(chuàng)建不同的傳感器對象。
定義傳感器接口(device.h)
#ifndef DEVICE_H
#define DEVICE_H
typedef struct Device {
void (*init)(void);
void (*read)(void);
void (*destroy)(struct Device* self);
} Device;
#endif各類型傳感器實現(xiàn)(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("溫度傳感器讀取數(shù)據(jù):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("濕度傳感器讀取數(shù)據(jù):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;
}定義工廠接口(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;
}
}使用工廠的主函數(shù)(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 應(yīng)用場景舉例
用戶空間
- 日志模塊封裝:使用工廠返回
file_logger/syslog_logger/udp_logger - 插件加載器:通過配置動態(tài)加載插件創(chuàng)建函數(shù)指針并注冊
內(nèi)核空間類比
- platform_driver 機(jī)制:
of_device_id表現(xiàn)類似“注冊表+工廠” - probe 函數(shù)中的創(chuàng)建與注冊過程 模擬工廠動態(tài)創(chuàng)建驅(qū)動實例
四、進(jìn)階設(shè)計:注冊表式工廠(更靈活)
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;
}這種寫法易于擴(kuò)展,只需新增注冊項。
總結(jié)
- 工廠模式是創(chuàng)建型設(shè)計模式的典型代表,適用于對象種類較多、結(jié)構(gòu)相似的場景。
- 在 C 語言中可以通過結(jié)構(gòu)體+函數(shù)指針靈活模擬面向?qū)ο笏枷搿?/li>
- 工廠模式可以大大降低模塊之間的耦合性,使系統(tǒng)更易于維護(hù)和擴(kuò)展。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言全部內(nèi)存操作函數(shù)的實現(xiàn)詳細(xì)講解
這篇文章主要介紹了C語言全部內(nèi)存操作函數(shù)的實現(xiàn)詳細(xì)講解,作者用圖文代碼實例講解的很清晰,有感興趣的同學(xué)可以研究下2021-02-02
Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫請求
這篇文章主要為大家介紹了Qt中是如何實現(xiàn)通用數(shù)據(jù)庫請求的,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03
C++圖論之Bellman-Ford算法和SPFA算法的實現(xiàn)
貝爾曼-福特算法(Bellman-Ford)是由理查德·貝爾曼和萊斯特·福特創(chuàng)立的,求解單源最短路徑問題的一種算法。SPFA 算法是 Bellman-Ford算法 的隊列優(yōu)化算法的別稱,通常用于求含負(fù)權(quán)邊的單源最短路徑。本文將詳解兩個算法的實現(xiàn),需要的可以參考一下2022-06-06
C語言中qsort函數(shù)使用及其模擬實現(xiàn)教程
C語言中存在著許多排序函數(shù),如我們熟悉的冒泡函數(shù),還有堆排序、歸并排序等等,這些排序函數(shù)的功能給我們帶來了許多便捷,這篇文章主要介紹了C語言中qsort函數(shù)使用及其模擬實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2025-08-08
C語言實現(xiàn)大數(shù)值金額大寫轉(zhuǎn)換的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用C語言實現(xiàn)大數(shù)值金額大寫轉(zhuǎn)換的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-03-03
C++使用TinyXML2實現(xiàn)解析和生成XML數(shù)據(jù)
TinyXML2是一個輕量級的、開源的C++庫,專門用于解析和生成XML文檔,本文主要為大家介紹了如何使用TinyXML2實現(xiàn)解析和生成XML數(shù)據(jù),需要的可以參考下2024-04-04

