工厂模式和多态(1)
2026/8/24大约 1 分钟
C语言工厂模式:和函数指针多态的区别
前面用函数指针实现了:
多态:解决“创建之后怎么统一使用”。
工厂模式解决的是:
创建:解决“到底创建哪一种对象”。
两者经常配合使用。
一、先看问题
假设有:
UART
SPI
I2C如果上层自己创建:
if (type == UART)
// 创建 UART
else if (type == SPI)
// 创建 SPI
else if (type == I2C)
// 创建 I2C上层既要知道:
怎么创建
又要知道:
怎么使用
创建和业务耦合在一起。
二、工厂模式:把创建拿出去
Device *device_create(int type)
{
switch (type)
{
case UART:
return uart_create();
case SPI:
return spi_create();
case I2C:
return i2c_create();
default:
return NULL;
}
}上层只需要:
Device *dev = device_create(UART);至于 UART 怎么初始化,交给工厂。
三、和前面的“多态”结合
前面的多态:
int device_read(Device *dev, uint8_t *buf, int len)
{
return dev->ops.read(dev->self, buf, len);
}上层只管:
device_read(dev, buf, len);不同设备通过 ops 调用不同实现:
Device
↓
ops
↓
UART / SPI / I2C所以:
工厂模式
→ 决定“创建谁”
函数指针多态
→ 决定“调用谁”四、组合起来
Device *dev = device_create(UART);
device_open(dev);
device_read(dev, buf, 10);
device_close(dev);完整流程:
device_create(UART)
↓
uart_create()
↓
Device *
↓
device_read()
↓
uart_read()改成:
Device *dev = device_create(SPI);上层调用代码不变:
device_open(dev);
device_read(dev, buf, 10);
device_close(dev);只是底层自动变成:
spi_open
spi_read
spi_close五、最终理解
工厂模式
↓
封装对象创建
↓
“我要什么设备?”
函数指针多态
↓
封装对象行为
↓
“这个设备怎么操作?”两者配合:
device_create()
↓
创建具体设备
↓
Device *
↓
函数指针多态
↓
UART / SPI / I2C 实现工厂负责“生谁”,多态负责“怎么用”。

