欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux下C語言實現(xiàn)工廠模式方式

 更新時間:2025年06月10日 16:34:56   作者:隱身模式  
這篇文章主要介紹了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)文章

  • Qt實現(xiàn)屏幕底部冒泡效果

    Qt實現(xiàn)屏幕底部冒泡效果

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)屏幕底部冒泡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 使用c++調(diào)用windows打印api進行打印的示例代碼

    使用c++調(diào)用windows打印api進行打印的示例代碼

    這篇文章主要介紹了使用c++調(diào)用windows打印api進行打印的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • C/C++解析文件名和目錄路徑的方法

    C/C++解析文件名和目錄路徑的方法

    #include <libgen.h> 是一個 C/C++ 語言的頭文件,主要用于字符串處理,特別是在處理文件路徑時,它提供了一些函數(shù)來幫助你解析文件名和目錄路徑,本文就給大家介紹一下C/C++解析文件名和目錄路徑的方法,需要的朋友可以參考下
    2024-10-10
  • C語言楊輝三角兩種實現(xiàn)方法

    C語言楊輝三角兩種實現(xiàn)方法

    大家好,本篇文章主要講的是C語言楊輝三角兩種實現(xiàn)方法,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言單循環(huán)鏈表的表示與實現(xiàn)實例詳解

    C語言單循環(huán)鏈表的表示與實現(xiàn)實例詳解

    這篇文章主要介紹了C語言單循環(huán)鏈表的表示與實現(xiàn),對于學習數(shù)據(jù)結(jié)構(gòu)與算法的朋友來說很有參考借鑒價值,需要的朋友可以參考下
    2014-07-07
  • C語言深入探究水仙花數(shù)與變種水仙花數(shù)代碼

    C語言深入探究水仙花數(shù)與變種水仙花數(shù)代碼

    求水仙花數(shù)和變種水仙花數(shù)是非常適合初學者學習的代碼,其中包含的循環(huán)和邏輯方式等知識點。這既能起到對以往知識的復習,也可以學習到一種不同的邏輯思考方式
    2022-05-05
  • C語言小程序 楊輝三角示例代碼

    C語言小程序 楊輝三角示例代碼

    輸入要顯示的楊輝三角的行數(shù),會打印出金字塔型的楊輝三角,不過行數(shù)太多的話,效果不太好,可以再調(diào)整一下格式控制
    2013-07-07
  • Opencv實現(xiàn)圖像灰度線性變換

    Opencv實現(xiàn)圖像灰度線性變換

    這篇文章主要為大家詳細介紹了Opencv實現(xiàn)圖像灰度線性變換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C++設計模式編程中簡單工廠與工廠方法模式的實例對比

    C++設計模式編程中簡單工廠與工廠方法模式的實例對比

    這篇文章主要介紹了C++設計模式編程中簡單工廠與工廠方法模式的實例對比,文中最后對兩種模式的優(yōu)缺點總結(jié)也比較詳細,需要的朋友可以參考下
    2016-03-03
  • C++ 中RTTI的使用方法詳解

    C++ 中RTTI的使用方法詳解

    這篇文章主要介紹了C++ 中RTTI的使用方法詳解的相關(guān)資料,希望通過本文大家能理解使用RTTI,需要的朋友可以參考下
    2017-09-09

最新評論