久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

嵌入式大雜燴
認(rèn)證:普通會(huì)員
作者動(dòng)態(tài)

嵌入式編程模型 | 簡(jiǎn)單工廠模式

一、簡(jiǎn)單工廠模式

簡(jiǎn)單工廠模式(Simple Factory Pattern)又稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。

通過一個(gè)工廠類封裝對(duì)象的創(chuàng)建邏輯,根據(jù)輸入?yún)?shù)動(dòng)態(tài)實(shí)例化具體產(chǎn)品類,實(shí)現(xiàn)創(chuàng)建與使用的解耦

在嵌入式系統(tǒng)中,該模式尤其適用于:

  • 多硬件驅(qū)動(dòng)兼容
  • 資源受限場(chǎng)景
  • 跨平臺(tái)適配

簡(jiǎn)單工廠模式核心結(jié)構(gòu)包含如下部分:

  • 工廠類:負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。
  • 抽象產(chǎn)品接口:所創(chuàng)建的所有對(duì)象的父類,負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
  • 具體產(chǎn)品類:所有創(chuàng)建的對(duì)象都充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例。

二、嵌入式應(yīng)用案例

1、LCD工廠框圖

  • 工廠類:根據(jù)傳入的型號(hào)參數(shù)創(chuàng)建對(duì)應(yīng)的LCD驅(qū)動(dòng)實(shí)例。
  • 抽象產(chǎn)品接口:LCD驅(qū)動(dòng)接口(包含初始化、寫命令、寫數(shù)據(jù)等方法)。
  • 具體產(chǎn)品類:不同型號(hào)的LCD驅(qū)動(dòng)(例如ST7789Driver, ILI9341Driver)。

2、代碼實(shí)現(xiàn)

UML類圖:

嵌入式設(shè)備需支持多種LCD屏幕(如ST7789、ILI9341),其初始化、寫命令等底層驅(qū)動(dòng)差異大,但上層應(yīng)用需統(tǒng)一調(diào)用接口。

代碼實(shí)現(xiàn)

C語言:

typedef enum{ 
    LCD_ST7789, 
    LCD_ILI9341
} LCD_Type;

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

// 具體產(chǎn)品:ST7789驅(qū)動(dòng)
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,
};

// 具體產(chǎn)品:ILI9341驅(qū)動(dòng)
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,
};

// 工廠類:根據(jù)屏幕類型返回驅(qū)動(dòng)實(shí)例(此處屏蔽不用)
//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++

// 抽象產(chǎn)品類: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() {}
};

// 具體產(chǎn)品類:ST7789驅(qū)動(dòng)
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() {}

// 具體產(chǎn)品類:ILI9341驅(qū)動(dòng)
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 };
    
    // 創(chuàng)建LCD驅(qū)動(dòng)實(shí)例
    static LCD_Driver* Create(LCD_Type type) {
        switch (type) {
            case LCD_ST7789: 
                returnnew ST7789_Driver();
            case LCD_ILI9341: 
                returnnew ILI9341_Driver();
            default: 
                returnnullptr;
        }
    }
};

調(diào)用示例

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

3、優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

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

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

(2)統(tǒng)一操作接口:

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

(3)方便擴(kuò)展新LCD型號(hào):

// 具體產(chǎn)品:xxx驅(qū)動(dòng)
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,
};

缺點(diǎn):

(1)違反開閉原則:新增驅(qū)動(dòng)需修改工廠

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

每次新增LCD型號(hào)都需要修改工廠函數(shù),違反"對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉"原則。在固件升級(jí)時(shí)可能引入風(fēng)險(xiǎn)。

(2)工廠職責(zé)過重:集中所有創(chuàng)建邏輯

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

當(dāng)支持10+種LCD時(shí),函數(shù)變得臃腫;編譯后代碼體積增大。

三、嵌入式場(chǎng)景適用性總結(jié)

簡(jiǎn)單工廠模式的要點(diǎn)在于:當(dāng)我們需要什么,只需要向工廠傳入一個(gè)正確的參數(shù),就可以獲取我們所需要的產(chǎn)品實(shí)例,而無須知道其創(chuàng)建細(xì)節(jié)。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 2
關(guān)注 30
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧