1. 工厂方法模式的核心概念与应用场景
工厂方法模式(Factory Method Pattern)是面向对象设计中最常用的创建型模式之一。在C语言这种非纯面向对象的编程语言中实现该模式,需要一些特殊的处理技巧。我们先从最基础的概念讲起。
工厂方法模式的核心思想是定义一个创建对象的接口,但让子类决定实例化哪一个类。这种设计将类的实例化推迟到子类进行,实现了"创建对象"与"使用对象"的分离。在C语言中,我们可以通过函数指针和结构体来模拟这种面向对象的特性。
提示:虽然C语言没有类的概念,但通过结构体+函数指针的组合,完全可以实现类似面向对象的设计模式。
工厂方法模式特别适用于以下场景:
- 当一个类不知道它需要创建哪个类的对象时
- 当一个类希望由其子类来指定它所创建的对象时
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化时
在嵌入式开发中,工厂方法模式应用非常广泛。比如处理不同型号的传感器时,虽然接口相同但具体实现不同,这时就可以用工厂方法来创建对应的传感器驱动实例。
2. C语言实现工厂方法模式的关键技术
2.1 使用函数指针模拟虚函数
C语言中没有类的概念,但我们可以用结构体来模拟类,用函数指针来模拟类的成员函数。这是实现工厂方法模式的基础。
c复制typedef struct Product {
void (*operation)(struct Product*);
} Product;
typedef struct Creator {
Product* (*factoryMethod)();
} Creator;
这里定义了两个基础结构体:Product表示产品接口,Creator表示创建者接口。factoryMethod就是工厂方法,它会返回一个Product指针。
2.2 具体产品实现
让我们实现一个具体的产品。假设我们正在开发一个图形库,需要创建不同形状的对象:
c复制typedef struct Circle {
Product base;
int x, y;
int radius;
} Circle;
void circleOperation(Product* product) {
Circle* circle = (Circle*)product;
printf("Drawing circle at (%d,%d) with radius %d\n",
circle->x, circle->y, circle->radius);
}
Product* createCircle() {
Circle* circle = malloc(sizeof(Circle));
circle->base.operation = circleOperation;
circle->x = 10;
circle->y = 20;
circle->radius = 30;
return (Product*)circle;
}
这里Circle是具体产品,它"继承"了Product结构体(通过包含base成员),并实现了自己的operation方法。
2.3 具体创建者实现
接下来实现具体的创建者,它负责创建Circle对象:
c复制typedef struct CircleCreator {
Creator base;
} CircleCreator;
Product* circleFactoryMethod() {
return createCircle();
}
Creator* createCircleCreator() {
CircleCreator* creator = malloc(sizeof(CircleCreator));
creator->base.factoryMethod = circleFactoryMethod;
return (Creator*)creator;
}
CircleCreator包含一个Creator结构体作为base成员,并实现了factoryMethod工厂方法。
3. 完整示例代码与使用方式
让我们把上面的代码整合成一个完整的示例:
c复制#include <stdio.h>
#include <stdlib.h>
// 产品接口
typedef struct Product {
void (*operation)(struct Product*);
} Product;
// 创建者接口
typedef struct Creator {
Product* (*factoryMethod)();
} Creator;
// 具体产品 - 圆形
typedef struct Circle {
Product base;
int x, y;
int radius;
} Circle;
void circleOperation(Product* product) {
Circle* circle = (Circle*)product;
printf("Drawing circle at (%d,%d) with radius %d\n",
circle->x, circle->y, circle->radius);
}
Product* createCircle() {
Circle* circle = malloc(sizeof(Circle));
circle->base.operation = circleOperation;
circle->x = 10;
circle->y = 20;
circle->radius = 30;
return (Product*)circle;
}
// 具体创建者 - 圆形创建者
typedef struct CircleCreator {
Creator base;
} CircleCreator;
Product* circleFactoryMethod() {
return createCircle();
}
Creator* createCircleCreator() {
CircleCreator* creator = malloc(sizeof(Cir
