/ 一、简介 /
建造者模式: 也称生成器模式,是 23 种设计模式中的一种,是一种创建型模式。适用情况:一个对象比较复杂,将一个对象的构建和对象的表示进行分离。
比较:与工厂模式进行对比,工厂模式不考虑对象部件组装过程,直接生成一个最终的对象,强调的是 结果 。而建造者模式先构建对象的每一个部件,然后再统一组建成一个对象,强调的是 过程 。
目的:实现复杂对象的生产流程与部件进行解耦。
/ 二、设计实现 /
以建造房子为例,房子有公寓、别墅、楼房等类型,虽然是不同种类的房子,但其建造过程大体上都相同,例如都有这些流程:修建墙、窗户、门、地板、楼顶等。
我们实现 Builder( 建造者 )建房,因为都有修建(墙、窗户、门、楼等)这些 部件 ,但是具体实现却不同,所以我们需要把实现这些组建的操作给抽象出来,把每个部件实现了,然后再组装起来,修建的房子就完成了。
typedef struct IBuilder_t //建造者抽象接口
{
void (*make_floor)(void *obj); //修建地板
void (*make_door)(void *obj); //修建门
void (*make_wall)(void *obj); //修建墙
void (*make_window)(void *obj); //修建窗
void (*destory)(void *obj); //释放内存
House_t *house; //house对象
}IBuilder_t;
定义房子对象,然后房子里面的部件(墙、窗、门、地板等)交给建造者设置修建。
typedef struct House_t //定义房子要实现的接口
{
void (*setfloor)(struct House_t* obj, char *floor);
void (*setdoor)(struct House_t* obj, char *door);
void (*setwall)(struct House_t* obj, char *wall);
void (*setwindow)(struct House_t* obj, char *window);
char floor[32]; //地板名字
char door[32]; //门名字
char wall[32]; //墙名字
char window[32]; //窗名字
}House_t;
//修建的地板类型。
//static修饰,不让外部直接调用这个函数,
//一般这些函数的实现放到.c文件中,结构体定义在.h文件中,
//而是通过House_t结构体的setfloor()函数指针进行调用,起到封装效果(下同)。
static void house_setfloor(House_t* obj, char *floor)
{
if(obj) sprintf(obj- >floor, "%s", floor);
}
//修建的门类型
static void house_setdoor(House_t* obj, char *door)
{
if(obj) sprintf(obj- >door, "%s", door);
}
//修建的墙类型
static void house_setwall(House_t* obj, char *wall)
{
if(obj) sprintf(obj- >wall, "%s", wall);
}
//修建的窗类型
static void house_setwindow(House_t* obj, char *window)
{
if(obj) sprintf(obj- >window, "%s", window);
}
//构造函数 创建一个房子的对象
//此处这个函数不能适用static修饰
//该函数是要开放被外部调用的
House_t* constructor_house(void)
{
House_t* house = (House_t*)malloc(sizeof(House_t)); //申请对象
house- >setdoor = house_setdoor; //函数指针赋值
house- >setfloor = house_setfloor; //函数指针赋值
house- >setwall = house_setwall; //函数指针赋值
house- >setwindow = house_setwindow;//函数指针赋值
return house; //返回一个房子对象
}