设计模式-建造者模式
作者:
也许
,
2022-05-22 21:23:01
,
所有人可见
,
阅读 279
工厂模式与建造者模式的区别
Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。
Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象
建造者模式
适用情况:
一个对象的构建比较复杂,将一个对象的构建(?)和对象的表示(?)进行分离。
对象的表示:对象的属性
对象的构建:对象的属性赋值
房子(对象):属性有:墙,地板,门
如何构建不同的房子(公寓,别墅的属性不同)
Builder:为创建产品各个部分(墙,地板,门),统一抽象接口。
ConcreteBuilder:继承自Builder,具体的创建产品的各个部分(实现),部分A, 部分B,部分C。并返回组装完成的对象
Director:构造一个使用Builder接口的对象。
Product:这个例子中表示房子,表示被构造的复杂对象。
构建公寓,别墅 案例代码
#include <iostream>
using namespace std;
#include "string"
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 FlatBuild : public Builder
{
public:
FlatBuild()
{
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 VillaBuild : public Builder
{
public:
VillaBuild()
{
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();
}
protected:
private:
};
void main()
{
House *pHose = new House;
pHose->setDoor("wbm门");
pHose->setFloor("wbmFloor");
pHose->setWall("wbmWall");
delete pHose;
Director *director = new Director;
Builder *builder = new FlatBuild;
director->Construct(builder);
House *house = builder->GetHouse();
cout << house->getFloor() << endl;
delete house;
delete builder;
builder = new VillaBuild;
director->Construct(builder);
house = builder->GetHouse();
cout << house->getFloor() << endl;
delete house;
delete builder;
delete director;
system("pause");
return ;
}