嵌入式C语言设计模式 --- 关于工厂模式的总结

本文详细介绍了嵌入式开发中常用的三种工厂模式:简单工厂、工厂方法和抽象工厂,分析了各自的优缺点。简单工厂模式在嵌入式场景常见,虽违反开闭原则但适用性强;工厂方法模式避免了过大类问题,但增加产品需新增工厂;抽象工厂模式适合生产配套模块,但代码复杂度高。设计模式的应用应根据业务需求灵活选择,遵循KISS原则。

前面三篇关于工厂模式的文章,主要介绍了三种工厂模式,分别是:简单工厂模式、工厂方法模式、抽象工厂模式。

关于这三种工厂模式,都各有利弊,应该根据不同的业务开发场景进行选择使用。

 图片来源:网络

简单工厂模式

是最容易理解的一种设计模式,简单工厂模式不属于23种设计模式之一,但简单工厂模式在多数嵌入式业务场景下,使用却非常广泛。

先说

嵌入式C语言开发中,工厂设计模式(Factory Design Pattern)是一种常用的创建型设计模式,用于封装对象的创建过程,使客户端代码与具体对象的创建解耦。这种模式嵌入式系统中尤其有用,因为它可以提高代码的可维护性和可扩展性,同时简化硬件抽象层(HAL)的设计。 ### 工厂设计模式的实现方法 在C语言中,工厂设计模式通常通过函数指针和结构体来实现。基本思路是定义一个接口(函数指针)来创建对象,而具体的对象创建逻辑由不同的工厂函数实现。以下是实现工厂设计模式的关键步骤: 1. **定义接口(函数指针)** 首先定义一个通用的接口,该接口用于创建对象。在嵌入式系统中,这通常是一个函数指针,指向一个返回特定结构体指针的函数。 ```c typedef struct Device* (*DeviceFactory)(void); ``` 2. **定义设备结构体** 定义一个通用的设备结构体,其中包含设备的基本操作函数指针。 ```c typedef struct { void (*init)(void); void (*read)(void); void (*write)(void); } Device; ``` 3. **实现具体设备** 实现具体的设备结构体及其操作函数。例如,定义一个LCD设备及其操作函数。 ```c static void lcdInit(void) { // LCD 初始化代码 } static void lcdRead(void) { // LCD 读取代码 } static void lcdWrite(void) { // LCD 写入代码 } static Device lcdDevice = { .init = lcdInit, .read = lcdRead, .write = lcdWrite }; struct Device* createLCDDevice(void) { return &lcdDevice; } ``` 4. **使用工厂函数创建设备** 在业务逻辑中,通过工厂函数创建设备对象,而不需要直接实例化具体设备。 ```c int main(void) { DeviceFactory factory = createLCDDevice; Device* device = factory(); device->init(); device->read(); device->write(); return 0; } ``` ### 最佳实践 1. **封装硬件抽象层(HAL)** 使用工厂模式可以将硬件相关的代码封装在具体的工厂实现中,使得上层代码不需要关心具体的硬件实现[^2]。 2. **支持多态性** 通过函数指针的方式,可以在运行时选择不同的实现,从而实现多态性。这在需要根据不同的硬件配置选择不同驱动程序时非常有用。 3. **易于扩展和维护** 如果需要添加新的设备类型,只需实现新的工厂函数和对应的设备结构体,而不需要修改现有的代码,符合开闭原则。 4. **提高代码复用性** 通过工厂模式,可以将通用的设备操作逻辑抽象出来,减少重复代码,提高代码的复用性。 ### 示例代码 以下是一个完整的示例,展示如何在嵌入式C中使用工厂模式创建不同的设备: ```c #include <stdio.h> // 定义设备接口 typedef struct { void (*init)(void); void (*read)(void); void (*write)(void); } Device; // 定义工厂接口 typedef Device* (*DeviceFactory)(void); // 具体设备1 - LCD static void lcdInit(void) { printf("LCD 初始化\n"); } static void lcdRead(void) { printf("LCD 读取数据\n"); } static void lcdWrite(void) { printf("LCD 写入数据\n"); } static Device lcdDevice = { .init = lcdInit, .read = lcdRead, .write = lcdWrite }; Device* createLCDDevice(void) { return &lcdDevice; } // 具体设备2 - UART static void uartInit(void) { printf("UART 初始化\n"); } static void uartRead(void) { printf("UART 读取数据\n"); } static void uartWrite(void) { printf("UART 写入数据\n"); } static Device uartDevice = { .init = uartInit, .read = uartRead, .write = uartWrite }; Device* createUARTDevice(void) { return &uartDevice; } // 主函数中使用工厂模式 int main(void) { DeviceFactory factory = createLCDDevice; Device* device = factory(); device->init(); device->read(); device->write(); // 切换到另一个设备 factory = createUARTDevice; device = factory(); device->init(); device->read(); device->write(); return 0; } ``` ### 总结 工厂设计模式嵌入式C语言开发中提供了一种灵活的方式来创建和管理设备对象。通过封装对象的创建过程,它使得代码更加模块化、易于维护和扩展。结合函数指针和结构体的特性,C语言可以有效地实现这一设计模式,从而提高嵌入式系统的可读性和可移植性[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工程师进阶笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值