前言
本文只是记录本人学习设计模式时记录的一些学习笔记,可能不全,但是可以做到一些提醒记忆的作用,如有侵权,联系删改,文章后会贴出学习时参考的链接。此前言适用于本人所写设计模式系列。
建造者
将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程。
结构
- Builder:为创建产品各个部分,统一抽象接口。
- Concrete Builder:具体的创建产品的各个部分,部分A, 部分B,部分C。
- Director:构造一个使用Builder接口的对象。
- Product:表示被构造的复杂对象。
- Concrete Builder:创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
示例
#include <iostream>
using namespace std;
class House
{
public:
void setFloor(string floor)
{
this->m_floor = floor;
}
void setWall(string wall)
{
this->m_wall = wall;
}
void setDoor(string door)
{
this->m_door = door;
}
string getFloor()
{
return m_floor;
}
string setWall()
{
return m_wall;
}
string setDoor()
{
return m_door;
}
protected:
private:
string m_floor;
string m_wall;
string m_door;
};
class Builder
{
public:
virtual void makeFloor() = 0;
virtual void makeWall() = 0;
virtual void makeDoor() = 0;
virtual House *GetHouse() = 0;
};
//公寓
class FlatBuildr : public Builder
{
public:
FlatBuildr()
{
pHouse = new House;
}
virtual void makeFloor()
{
pHouse->setFloor("flat Door");
}
virtual void makeWall()
{
pHouse->setWall("flat Wall");
}
virtual void makeDoor()
{
pHouse->setDoor("flat Door");
}
virtual House *GetHouse()
{
return pHouse;
}
private:
House *pHouse;
};
//别墅
class VillaBuildr : public Builder
{
public:
VillaBuildr()
{
pHouse = new House;
}
virtual void makeFloor()
{
pHouse->setFloor("villa floor");
}
virtual void makeWall()
{
pHouse->setWall("villa Wall");
}
virtual void makeDoor()
{
pHouse->setDoor("villa Door");
}
virtual House *GetHouse()
{
return pHouse;
}
private:
House *pHouse;
};
class Director
{
public:
void Construct(Builder *builder)
{
builder->makeFloor();
builder->makeWall();
builder->makeDoor();
}
};
int main()
{
//客户直接造房子
House *pHose = new House;
pHose->setDoor("门");
pHose->setFloor("地板");
pHose->setWall("墙");
delete pHose;
/* //工程队直接造房子
Builder *builder = new FlatBuildr;
builder->makeFloor();
builder->makeWall();
builder->makeDoor();
*/
//指挥者(设计师)指挥 工程队 和 建房子
Director *director = new Director;
//建公寓
Builder *builder = new FlatBuildr;
director->Construct(builder); //设计师 指挥 工程队干活
House *house = builder->GetHouse();
cout << house->getFloor() << endl;
delete house;
delete builder;
//建别墅
builder = new VillaBuildr;
director->Construct(builder); //设计师 指挥 工程队干活
house = builder->GetHouse();
cout << house->getFloor() << endl;
delete house;
delete builder;
delete director;
return 0;
}
参考: