定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
简单工厂模式
需求
一个大学生,以学雷锋做好事的名义去帮助老人做事。
代码
#include<stdio.h>#include<stdlib.h>typedefstructLeifeng{void(*sweep)();void(*wash)();void(*buyRice)();}Leifeng;voidSweep(){printf("扫地\n");}voidWash(){printf("洗衣\n");}voidBuyRice(){printf("买米\n");}Leifeng*ConstructLeiFeng(){Leifeng*obj=(Leifeng*)malloc(sizeof(Leifeng));obj->sweep=Sweep;obj->wash=Wash;obj->buyRice=BuyRice;returnobj;}// 学雷锋typedefstructUndergradute{Leifeng base;}Undergradute;typedefstructVolunteer{Leifeng base;}Volunteer;Undergradute*ConstructGraduate(){Undergradute*obj=(Undergradute*)malloc(sizeof(Undergradute));obj->base.sweep=Sweep;obj->base.wash=Wash;obj->base.buyRice=BuyRice;returnobj;}Volunteer*ConstructVolunteer(){Volunteer*obj=(Volunteer*)malloc(sizeof(Volunteer));obj->base.sweep=Sweep;obj->base.wash=Wash;obj->base.buyRice=BuyRice;returnobj;}typedefstructXueLeifengFactory{Leifeng*(*createLeiFeng)();}XueLeifengFactory;Leifeng*CreateLeifeng(){returnConstructLeiFeng();}Leifeng*CreateUndergraduate(){return(Leifeng*)ConstructGraduate();}Leifeng*CreateVoluteer(){return(Leifeng*)ConstructVolunteer();}客户端:
intmain(){XueLeifengFactory factory={CreateUndergraduate};Leifeng*student=factory.createLeiFeng();student->sweep();student->wash();student->buyRice();free(student);return0;}UML图
总结
- 工厂方法模式相比简单工厂模式的优点?
简单工厂模式在新增加功能时,需要修改工厂类,违背了开闭原则。工厂方法使一个类的实例化延迟到其子类,新增功能时增加一个工厂子类即可。缺点是由于每加一个产品,就需要加一个产品工厂的接口,增加了额外的开发量。