精品国产一区在线_av无码中文字幕无码王_天海翼三点刺激高潮不停_好硬好大好爽视频_欧美高清一区三区在线专区_香蕉黄色片

嵌入式編程模型 | 簡單工廠模式

一、簡單工廠模式

簡單工廠模式(Simple Factory Pattern)又稱為靜態工廠方法(Static Factory Method)模式,它屬于類創建型模式。

通過一個工廠類封裝對象的創建邏輯,根據輸入參數動態實例化具體產品類,實現創建與使用的解耦

在嵌入式系統中,該模式尤其適用于:

  • 多硬件驅動兼容
  • 資源受限場景
  • 跨平臺適配

簡單工廠模式核心結構包含如下部分:

  • 工廠類:負責實現創建所有實例的內部邏輯。
  • 抽象產品接口:所創建的所有對象的父類,負責描述所有實例所共有的公共接口。
  • 具體產品類:所有創建的對象都充當這個角色的某個具體類的實例。

二、嵌入式應用案例

1、LCD工廠框圖

  • 工廠類:根據傳入的型號參數創建對應的LCD驅動實例。
  • 抽象產品接口:LCD驅動接口(包含初始化、寫命令、寫數據等方法)。
  • 具體產品類:不同型號的LCD驅動(例如ST7789Driver, ILI9341Driver)。

2、代碼實現

UML類圖:

嵌入式設備需支持多種LCD屏幕(如ST7789、ILI9341),其初始化、寫命令等底層驅動差異大,但上層應用需統一調用接口。

代碼實現

C語言:

typedef enum{ 
    LCD_ST7789, 
    LCD_ILI9341
} LCD_Type;

// 抽象產品:LCD操作接口
typedefstruct {
    void (*Init)(void);
    void (*WriteCommand)(uint8_t cmd);
    void (*DisplayText)(constchar *text);
    void (*Clear)(void);
} LCD_Driver;

// 具體產品:ST7789驅動
void ST7789_Init(void){}
void ST7789_WriteCommand(uint8_t cmd){}
void ST7789_DisplayText(const char *text){}
void ST7789_Clear(void){}
LCD_Driver ST7789_Driver = {
    ST7789_Init, 
    ST7789_WriteCommand,
    ST7789_DisplayText,
    ST7789_Clear,
};

// 具體產品:ILI9341驅動
void ILI9341_Init(void){}
void ILI9341_WriteCommand(uint8_t cmd){}
void ILI9341_DisplayText(const char *text){}
void ILI9341_Clear(void){}
LCD_Driver ILI9341_Driver = {
    ILI9341_Init, 
    ILI9341_WriteCommand,
    ILI9341_DisplayText,
    ILI9341_Clear,
};

// 工廠類:根據屏幕類型返回驅動實例(此處屏蔽不用)
//typedef struct {
//    void (*Create)(LCD_Type type);
//} LCD_Factory;

LCD_Driver* LCD_Factory_Create(LCD_Type type) {
    switch (type) {
        case LCD_ST7789: return &ST7789_Driver;
        case LCD_ILI9341: return &ILI9341_Driver;
        default: returnNULL;
    }
}

C++

// 抽象產品類:LCD操作接口
class LCD_Driver {
public:
    virtual void Init() = 0;
    virtual void WriteCommand(uint8_t cmd) = 0;
    virtual void DisplayText(const char *text) = 0;
    virtual void Clear() = 0;
    
    virtual ~LCD_Driver() {}
};

// 具體產品類:ST7789驅動
class ST7789_Driver :public LCD_Driver {
public:
    void Init() override;
    void WriteCommand(uint8_t cmd) override;
    void DisplayText(const char *text) override;
    void Clear() override;
};
void ST7789_Driver::Init() {}
void ST7789_Driver::WriteCommand(uint8_t cmd) {}
void ST7789_Driver::DisplayText(const char *text) {}
void ST7789_Driver::Clear() {}

// 具體產品類:ILI9341驅動
class ILI9341_Driver :public LCD_Driver {
public:
    void Init() override;
    void WriteCommand(uint8_t cmd) override;
    void DisplayText(const char *text) override;
    void Clear() override;
};

void ILI9341_Driver::Init() {}
void ILI9341_Driver::WriteCommand(uint8_t cmd) {}
void ILI9341_Driver::DisplayText(const char *text) {}
void ILI9341_Driver::Clear() {}

// 工廠類
class LCD_Factory {
public:
    enum LCD_Type { LCD_ST7789, LCD_ILI9341 };
    
    // 創建LCD驅動實例
    static LCD_Driver* Create(LCD_Type type) {
        switch (type) {
            case LCD_ST7789: 
                returnnew ST7789_Driver();
            case LCD_ILI9341: 
                returnnew ILI9341_Driver();
            default: 
                returnnullptr;
        }
    }
};

調用示例

LCD_Driver *lcd = LCD_Factory_Create(LCD_ST7789);
lcd->Init();

3、優缺點

優點:

(1)更換LCD只需改一行代碼:

// 從ST7789切換到ILI9341
LCD_Driver *lcd = LCD_Factory_Create(LCD_ILI9341);

(2)統一操作接口:

// 無論什么型號的LCD,調用方式相同
lcd->DisplayText("Temp: 25.5C");
lcd->Clear();

(3)方便擴展新LCD型號:

// 具體產品:xxx驅動
void xxx_Init(void){}
void xxx_WriteCommand(uint8_t cmd){}
void xxx_DisplayText(const char *text){}
void xxx_Clear(void){}
LCD_Driver xxx_Driver = {
    xxx_Init, 
    xxx_WriteCommand,
    xxx_DisplayText,
    xxx_Clear,
};

缺點:

(1)違反開閉原則:新增驅動需修改工廠

LCD_Driver* LCD_Factory_Create(uint8_t type) {
    switch (type) {
        case LCD_ST7789: return &ST7789_Driver;
        case LCD_ILI9341: return &ILI9341_Driver;
        // 新增驅動必須修改此處 ↓
        case LCD_XXX: return &XXX_Driver;
        default: return NULL;
    }
}

每次新增LCD型號都需要修改工廠函數,違反"對擴展開放,對修改關閉"原則。在固件升級時可能引入風險。

(2)工廠職責過重:集中所有創建邏輯

LCD_Driver* LCD_Factory_Create(uint8_t type) {
    switch (type) {
        case LCD_ST7789: return &ST7789_Driver;
        case LCD_ILI9341: return &ILI9341_Driver;
        // 可能還有數十種驅動
        default: return NULL;
    }
}

當支持10+種LCD時,函數變得臃腫;編譯后代碼體積增大。

三、嵌入式場景適用性總結

簡單工廠模式的要點在于:當我們需要什么,只需要向工廠傳入一個正確的參數,就可以獲取我們所需要的產品實例,而無須知道其創建細節。

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 2
收藏 2
關注 30
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 欧美成人午夜免费视在线看片 | 一级做a爰片久久毛片美女图片 | 欧美video粗暴videos | 白浆在线视频 | 国产亚洲2021成人乱码 | 性一交一乱一伦一色一情丿按摩 | 色汉综合丝袜 | 亚洲欧美综合精品成人网站 | 亚洲自偷自拍另类11P | 国产第一福利影院 | 九九九视频在线观看 | 欧日韩免费视频 | 国产五月天在线 | javhdfreejaⅴhd | VIDEOS1080P内射少妇 | 爱爱视频在线看 | 香蕉久久一区二区不卡无毒影院 | 成人精品久久久 | 新版天堂资源中文www官网 | 成人欧美 | 色天使亚洲综合一区二区 | 亚洲中文久久久久久精品 | 免费看a毛片| 七年之痒2018免费观看 | 亚洲高清日本 | caoporm超免费公开视频 | 色午夜av| 国产玉足榨精视频在线 | 99久久婷婷国产一区二区 | 日本日本乱码伦视频在线观看 | 在线观看区 | 亚洲欧美综合一区二区三区黄大片 | 国产高清在线观看 | 国产精品婷婷色综合www在线 | 特黄特色一级片 | 久久久久久国产一区二区三区 | 91?清免费看| 豆花视频在线 | 91麻豆精品国产91久久久无需广告 | 精品国产一区二区三区麻豆小说 | 91网站免费入口 |