**将对象的构建和对象的表示分离开来
优势:对于使用者来说只需要选择不同类型的产品按照指定的框架就可以得到产品**
#include<iostream>
#include <string>
using namespace std;
//想要构建的产品的各个零件组成类
class house
{
public:
void setDoor(const string &door)
{
_door = door;
cout << door << endl;
}
void setfloor(const string &floor)
{
_floor = floor;
cout << floor << endl;
}
void setwindow(const string &window)
{
_window = window;
cout << window << endl;
}
string getDoor()
{
return _door;
}
string getFloor()
{
return _floor;
}
string getWindow()
{
return _window;
}
private:
string _door;
string _floor;
string _window;
};
//建造者(工程队)抽象类
class Builder
{
public:
virtual void buildDoor() = 0;
virtual void buildFloor() = 0;
virtual void buildWindow() = 0;
virtual house *getHouse() = 0;
};
//A工程队
class A_Builder : public Builder
{
public:
A_Builder()
{
_house = new house;
}
void buildDoor()
{
_house->setDoor("A Door");
}
void buildFloor()
{
_house->setfloor("A Floor");
}
void buildWindow()
{
_house->setwindow("A Windows");
}
house *getHouse()
{
return _house;
}
private:
house *_house;
};
//B工程队
class B_Builder : public Builder
{
public:
B_Builder()
{
_house = new house;
}
void buildDoor()
{
_house->setDoor("B Door");
}
void buildFloor()
{
_house->setfloor("B Floor");
}
void buildWindow()
{
_house->setwindow("B Windows");
}
house *getHouse()
{
return _house;
}
private:
house *_house;
};
//指挥者
class direct
{
public:
//指挥者选择工程队
direct(Builder *builder)
{
this->_builder = builder;
}
void DIYHouse()
{
_builder->buildDoor();
_builder->buildFloor();
_builder->buildWindow();
}
private:
Builder *_builder;
};
int main()
{
house *myHouse = nullptr;
Builder *builder = nullptr;
direct *myDirect = nullptr;
//建造一个A类型的房子
**builder = new A_Builder;**
myDirect = new direct(builder);
myDirect->DIYHouse();
myHouse = builder->getHouse();
myHouse->getDoor();
myHouse->getFloor();
myHouse->getWindow();
delete myDirect;
delete builder;
delete myHouse;
//建造一个B类型的房子
**builder = new B_Builder;**
myDirect = new direct(builder);
myDirect->DIYHouse();
myHouse = builder->getHouse();
myHouse->getDoor();
myHouse->getFloor();
myHouse->getWindow();
delete myDirect;
delete builder;
delete myHouse;
return 0;
}
建议在使用建造者模式的时候,将产品类抽象出来一层,设计者类同样抽象出来一层