c语言实现工厂模式
时间: 2023-07-27 20:15:06 浏览: 57
工厂模式是一种常见的设计模式,它提供了一种创建对象的方法,而无需暴露对象创建的逻辑。在 C 语言中,实现工厂模式的一种常见方式是使用函数指针。下面是一个简单的例子,演示了如何使用工厂模式创建不同类型的对象:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义一个抽象基类
typedef struct {
void (*print)(void);
} Shape;
// 定义具体类
typedef struct {
Shape shape;
int width;
int height;
} Rectangle;
typedef struct {
Shape shape;
int radius;
} Circle;
// 定义具体类的构造函数
void Rectangle_construct(Rectangle* rect, int width, int height) {
rect->shape.print = (void(*)(void))Rectangle_print;
rect->width = width;
rect->height = height;
}
void Circle_construct(Circle* circle, int radius) {
circle->shape.print = (void(*)(void))Circle_print;
circle->radius = radius;
}
// 定义具体类的成员函数
void Rectangle_print(void) {
printf("This is a rectangle with width=%d, height=%d\n", ((Rectangle*)this)->width, ((Rectangle*)this)->height);
}
void Circle_print(void) {
printf("This is a circle with radius=%d\n", ((Circle*)this)->radius);
}
// 工厂函数,根据类型创建对象
void* Shape_create(char type, int arg1, int arg2) {
switch (type) {
case 'r':
Rectangle* rect = (Rectangle*)malloc(sizeof(Rectangle));
Rectangle_construct(rect, arg1, arg2);
return rect;
case 'c':
Circle* circle = (Circle*)malloc(sizeof(Circle));
Circle_construct(circle, arg1);
return circle;
default:
return NULL;
}
}
int main() {
Shape* shape1 = (Shape*)Shape_create('r', 20, 30);
Shape* shape2 = (Shape*)Shape_create('c', 10, 0);
shape1->print();
shape2->print();
free(shape1);
free(shape2);
return 0;
}
```
在上面的代码中,我们定义了一个抽象基类 `Shape`,它有一个成员函数 `print`,用于输出对象的信息。然后,我们又定义了两个具体类 `Rectangle` 和 `Circle`,它们分别继承自 `Shape`。每个具体类都有一个构造函数和一个成员函数 `print`。
接下来,我们定义了一个工厂函数 `Shape_create`,它根据类型参数创建相应的对象。如果类型参数是 `'r'`,则创建一个 `Rectangle` 对象;如果类型参数是 `'c'`,则创建一个 `Circle` 对象。最后,我们在 `main` 函数中使用工厂函数创建了两个对象,并调用它们的 `print` 函数输出了对象的信息。注意,我们在程序结束时需要手动释放对象占用的内存。