工厂模式和多态(2)
2026/8/24大约 2 分钟
C语言工厂模式:把设备创建独立出来
前面的函数指针多态已经解决了:
不同设备怎么统一使用。
现在继续解决:
不同设备怎么统一创建。
这就是工厂模式。
一、原来的问题
原来的 UART:
UartDevice uart1;
void device_init(void)
{
uart1.port = 1;
uart1.base.ops.open = uart_open;
uart1.base.ops.read = uart_read;
uart1.base.ops.close = uart_close;
uart1.base.self = &uart1;
}上层必须知道:
UartDevice怎么创建ops怎么绑定self指向哪里
也就是说:
创建细节暴露给了上层。
二、第一步:把 UART 创建封装起来
把原来的初始化代码放进:
Device *uart_create(int port)
{
static UartDevice uart;
uart.port = port;
uart.base.ops.open = uart_open;
uart.base.ops.read = uart_read;
uart.base.ops.close = uart_close;
uart.base.self = &uart;
return &uart.base;
}以后创建 UART 只需要:
Device *dev = uart_create(1);上层不再关心:
UartDevice 怎么初始化
ops 怎么绑定
self 指向哪里这就是工厂的第一步:
把“怎么创建”封装起来。
三、进一步支持 UART、SPI、I2C
定义设备类型:
typedef enum
{
DEVICE_UART,
DEVICE_SPI,
DEVICE_I2C
} DeviceType;再建立统一工厂:
Device *device_create(DeviceType type)
{
switch (type)
{
case DEVICE_UART:
return uart_create(1);
case DEVICE_SPI:
return spi_create(1);
case DEVICE_I2C:
return i2c_create(0x50);
default:
return NULL;
}
}现在上层只需要:
Device *dev = device_create(DEVICE_UART);或者:
Device *dev = device_create(DEVICE_SPI);创建谁,由工厂决定。
四、创建后怎么使用?
前面的多态接口完全不需要改变:
void device_open(Device *dev)
{
dev->ops.open(dev->self);
}
int device_read(Device *dev, uint8_t *buf, int len)
{
return dev->ops.read(dev->self, buf, len);
}
void device_close(Device *dev)
{
dev->ops.close(dev->self);
}所以:
Device *dev = device_create(DEVICE_UART);
device_open(dev);
device_read(dev, buf, 10);
device_close(dev);换成 SPI:
Device *dev = device_create(DEVICE_SPI);
device_open(dev);
device_read(dev, buf, 10);
device_close(dev);上层调用完全不变。
五、工厂和多态分别解决什么?
工厂模式
↓
device_create()
↓
决定创建 UART / SPI / I2C
↓
解决“创建谁”
函数指针多态
↓
device_open/read/close()
↓
决定调用哪个实现
↓
解决“怎么用”两者组合:
device_create()
↓
具体设备
↓
统一 Device *
↓
函数指针
↓
UART / SPI / I2C六、最终理解
工厂负责“生对象”,多态负责“用对象”。
这样新增设备时:
增加新设备实现
↓
增加对应 create()
↓
接入工厂
↓
上层代码基本不动这就是工厂模式在嵌入式驱动框架中的价值:
把对象创建与对象使用解耦。

