版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30042269/article/details/83818107
建造者模式(Client、Director、Builder和Product)
Builder负责Product类对象的具体过程构建,Director负责指导Build,要求Builder按照其指定的顺序去完成Product的构造。最后通过Builder返回建造后的结果。
适用场景:
简单地说,就好象我要一座房子住,可是我不知道怎么盖(简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高),于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工要,记住了!(转,觉得比较容易理解)。
分析
IBuilder(抽象建造者):创建一个产品对象的各个部件指定抽象接口, 包含建造各部件的方法。
Builder_CottageStyle(具体建造者):实现 IBuilder 的接口,并提供一个输出完成后产品的接口。
Director(指挥者):构造一个使用 IBuilder 接口的对象,内部调用IBuilder对象建造产品。
Room(产品):输出的产品。
代码
//main.h
#ifndef MAIN_H
#define MAIN_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include "unistd.h"
#define RELEASE(p) {if(p) {delete p; p = NULL;}}
//////////////定义产品Room//////////////
class Room
{
public:
void setFloor(std::string floor){m_floor = floor;}
void setDoor(std::string door){m_door = door;}
std::string getFloor(){return m_floor;}
std::string getDoor(){return m_door;}
private:
std::string m_floor;
std::string m_door;
};
//////////////定义抽象建造者//////////////
class IBuilder
{
public:
virtual ~IBuilder(){}
virtual void buildDoor() = 0;
virtual void buildFloor() = 0;
virtual Room * getRoom() = 0;
};
////////////////定义设计者////////////////
class Director
{
public:
Director(){}
void Create(IBuilder* builder) {
builder->buildDoor();
builder->buildFloor();
}
};
//////////////定义具体建造者//////////////
class Builder_traditionalStyle:public IBuilder
{
public:
Builder_traditionalStyle(){m_room = new Room();}
virtual ~Builder_traditionalStyle(){RELEASE(m_room);}
virtual void buildDoor();
virtual void buildFloor();
virtual Room * getRoom();
private:
Room* m_room;
};
//////////////定义具体建造者//////////////
class Builder_CottageStyle:public IBuilder
{
public:
Builder_CottageStyle(){m_room = new Room();}
virtual ~Builder_CottageStyle(){RELEASE(m_room);}
virtual void buildDoor();
virtual void buildFloor();
virtual Room * getRoom();
private:
Room* m_room;
};
#endif // MAIN_H
//main.cpp
#include "main.h"
//////Builder_traditionalStyle////////
void Builder_traditionalStyle::buildDoor()
{
m_room->setDoor("black");
}
void Builder_traditionalStyle::buildFloor()
{
m_room->setFloor("brown");
}
Room* Builder_traditionalStyle::getRoom()
{
return m_room;
}
//////Builder_CottageStyle////////
void Builder_CottageStyle::buildDoor()
{
m_room->setDoor("yellow");
}
void Builder_CottageStyle::buildFloor()
{
m_room->setFloor("white");
}
Room* Builder_CottageStyle::getRoom()
{
return m_room;
}
int main(int argc, char *argv[])
{
std::cout<<"========Hello======"<<std::endl;
//创建设计师
Director* dir = new Director();
//创建房屋建造者
IBuilder* builder_cottageStyle = new Builder_CottageStyle();
IBuilder* builder_traditionalStyle = new Builder_traditionalStyle();
//设计师指挥建造
dir->Create(builder_cottageStyle);
//从建造者获得建好的房屋
Room* room = builder_cottageStyle->getRoom();
std::cout<<"[Room]door:"<<room->getDoor()<<std::endl;
std::cout<<"[Room]floor:"<<room->getFloor()<<std::endl;
RELEASE(dir);
RELEASE(builder_cottageStyle);
RELEASE(builder_traditionalStyle);
RELEASE(room);
return 0;
}
输出
========Hello======
[Room]door:yellow
[Room]floor:white
参考网上资料: