定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
需求
一个大学生,以学雷锋做好事的名义去帮助老人做事。
代码
c
#include <stdio.h>
#include <stdlib.h>
typedef struct Leifeng
{
void (*sweep)();
void (*wash)();
void (*buyRice)();
} Leifeng;
void Sweep() {
printf("扫地\n");
}
void Wash() {
printf("洗衣\n");
}
void BuyRice() {
printf("买米\n");
}
Leifeng *ConstructLeiFeng() {
Leifeng *obj = (Leifeng *)malloc(sizeof(Leifeng));
obj->sweep = Sweep;
obj->wash = Wash;
obj->buyRice = BuyRice;
return obj;
}
// 学雷锋
typedef struct Undergradute {
Leifeng base;
} Undergradute;
typedef struct Volunteer {
Leifeng base;
} Volunteer;
Undergradute *ConstructGraduate() {
Undergradute *obj = (Undergradute *)malloc(sizeof(Undergradute));
obj->base.sweep = Sweep;
obj->base.wash = Wash;
obj->base.buyRice = BuyRice;
return obj;
}
Volunteer *ConstructVolunteer() {
Volunteer *obj = (Volunteer *)malloc(sizeof(Volunteer));
obj->base.sweep = Sweep;
obj->base.wash = Wash;
obj->base.buyRice = BuyRice;
return obj;
}
typedef struct XueLeifengFactory {
Leifeng *(*createLeiFeng)();
} XueLeifengFactory;
Leifeng *CreateLeifeng() {
return ConstructLeiFeng();
}
Leifeng *CreateUndergraduate() {
return (Leifeng *)ConstructGraduate();
}
Leifeng *CreateVoluteer() {
return (Leifeng *)ConstructVolunteer();
}
客户端:
c
int main() {
XueLeifengFactory factory = {CreateUndergraduate};
Leifeng *student = factory.createLeiFeng();
student->sweep();
student->wash();
student->buyRice();
free(student);
return 0;
}
UML图

总结
- 工厂方法模式相比简单工厂模式的优点?
简单工厂模式在新增加功能时,需要修改工厂类,违背了开闭原则。工厂方法使一个类的实例化延迟到其子类,新增功能时增加一个工厂子类即可。缺点是由于每加一个产品,就需要加一个产品工厂的接口,增加了额外的开发量。