Linux下C語言實現(xiàn)工廠模式方式
在嵌入式開發(fā)和系統(tǒng)編程中,良好的架構(gòu)設計 能有效提升代碼的可維護性、可擴展性。雖然 C 語言不是面向?qū)ο笳Z言,但通過結(jié)構(gòu)體與函數(shù)指針等手段,我們依然可以實現(xiàn)經(jīng)典的設計模式。
本文將深入講解如何在 Linux 環(huán)境下使用 C 語言實現(xiàn)工廠模式(Factory Pattern),并結(jié)合實際案例說明其優(yōu)勢與應用場景。
一、工廠模式簡介
什么是工廠模式?
工廠模式是一種創(chuàng)建型設計模式,用于隱藏對象創(chuàng)建邏輯,將實例化過程交由工廠類負責。
調(diào)用者只關(guān)心產(chǎn)品的“接口”,不關(guān)心具體實現(xiàn),從而實現(xiàn)解耦。
C 語言實現(xiàn)設計模式的挑戰(zhàn)
- 沒有類和繼承
- 無多態(tài)機制
- 類型系統(tǒng)不如 C++ 靈活
解決辦法:
- 使用
struct模擬類 - 使用函數(shù)指針模擬方法
- 使用枚舉/注冊表實現(xiàn)工廠分發(fā)
二、實現(xiàn)簡單工廠模式(Simple Factory)
我們以“不同類型的傳感器”為例,定義一個統(tǒng)一的設備接口,由工廠創(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 應用場景舉例
用戶空間
- 日志模塊封裝:使用工廠返回
file_logger/syslog_logger/udp_logger - 插件加載器:通過配置動態(tài)加載插件創(chuàng)建函數(shù)指針并注冊
內(nèi)核空間類比
- platform_driver 機制:
of_device_id表現(xiàn)類似“注冊表+工廠” - probe 函數(shù)中的創(chuàng)建與注冊過程 模擬工廠動態(tài)創(chuàng)建驅(qū)動實例
四、進階設計:注冊表式工廠(更靈活)
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;
}這種寫法易于擴展,只需新增注冊項。
總結(jié)
- 工廠模式是創(chuàng)建型設計模式的典型代表,適用于對象種類較多、結(jié)構(gòu)相似的場景。
- 在 C 語言中可以通過結(jié)構(gòu)體+函數(shù)指針靈活模擬面向?qū)ο笏枷搿?/li>
- 工廠模式可以大大降低模塊之間的耦合性,使系統(tǒng)更易于維護和擴展。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用c++調(diào)用windows打印api進行打印的示例代碼
這篇文章主要介紹了使用c++調(diào)用windows打印api進行打印的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06
C語言單循環(huán)鏈表的表示與實現(xiàn)實例詳解
這篇文章主要介紹了C語言單循環(huán)鏈表的表示與實現(xiàn),對于學習數(shù)據(jù)結(jié)構(gòu)與算法的朋友來說很有參考借鑒價值,需要的朋友可以參考下2014-07-07
C語言深入探究水仙花數(shù)與變種水仙花數(shù)代碼
求水仙花數(shù)和變種水仙花數(shù)是非常適合初學者學習的代碼,其中包含的循環(huán)和邏輯方式等知識點。這既能起到對以往知識的復習,也可以學習到一種不同的邏輯思考方式2022-05-05

