简述
将一个复杂对象的构建与它的表示分离,使同样的构造过程可以创建不同的表示,
用户通过指定建造的类型就可以得到它们,而不需要关心具体的建造过程和细节,
场景说明
建造一辆车是比较复杂的,一辆车的部件必须包括车身,轮胎和引擎,但不同车辆的部件是不同的。
比如卡车和小轿车,它们建造流程相同,都需要车身,轮胎和引擎,但它们的建造的部件规格,大小显然是不同
UML类图
将一个复杂对象的构建与它的表示分离,使同样的构造过程可以创建不同的表示,
用户通过指定建造的类型就可以得到它们,而不需要关心具体的建造过程和细节,
场景说明
建造一辆车是比较复杂的,一辆车的部件必须包括车身,轮胎和引擎,但不同车辆的部件是不同的。
比如卡车和小轿车,它们建造流程相同,都需要车身,轮胎和引擎,但它们的建造的部件规格,大小显然是不同
UML类图
![](https://i-blog.csdnimg.cn/blog_migrate/5ee0903100e4f9df147c06b0eeb7bb99.png)
对象说明
Director 指挥者,指挥建造产品的流程
BuliderVehicle 建造抽象,指定建造一个产品需要的所有部件抽象接口
BuliderCar 具体的建造者,创建各个部件
Vehicle 具体建造的产品
实现
//车辆
class Vehicle
{
public:
Vehicle()
{
mVehicleBody = "";
mTyre = "";
mEngine = "";
}
public:
std::string mVehicleBody; //车身
std::string mTyre; //轮胎
std::string mEngine; //引擎
void show()
{
if (mVehicleBody == "" || mTyre == "" || mEngine == "")
{
std::cout << "车辆没有建造 " << std::endl;
return;
}
std::cout << "车辆建造完成 " << mVehicleBody << " " << mTyre << " " << mEngine << std::endl;
}
};
//车辆建造抽象类
class BuliderVehicle
{
public:
BuliderVehicle()
{
}
virtual void BuliderVehicleBody() = 0;
virtual void BuliderTyre() = 0;
virtual void BuliderEngine() = 0;
};
//车辆建造具体实现,大卡车
class BuliderTruck :public BuliderVehicle
{
public:
BuliderTruck(Vehicle *vehicle)
{
mVehicle = vehicle;
}
void BuliderVehicleBody()
{
mVehicle->mVehicleBody = "卡车车身";
}
void BuliderTyre()
{
mVehicle->mTyre = "卡车轮胎";
}
void BuliderEngine()
{
mVehicle->mEngine = "卡车引擎";
}
private:
Vehicle *mVehicle;
};
//车辆建造具体实现,小轿车
class BuliderCar :public BuliderVehicle
{
public:
BuliderCar(Vehicle *vehicle)
{
mVehicle = vehicle;
}
void BuliderVehicleBody()
{
mVehicle->mVehicleBody = "小轿车车身";
}
void BuliderTyre()
{
mVehicle->mTyre = "小轿车轮胎";
}
void BuliderEngine()
{
mVehicle->mEngine = "小轿车引擎";
}
private:
Vehicle *mVehicle;
};
//指挥者
class Director
{
public:
Director()
{
}
void Construct(BuliderVehicle *buliderVehicle)
{
buliderVehicle->BuliderVehicleBody();
buliderVehicle->BuliderTyre();
buliderVehicle->BuliderEngine();
}
};
int main()
{
Vehicle v;
BuliderTruck b(&v);
Director d;
d.Construct(&b);
v.show();
BuliderCar b1(&v);
d.Construct(&b1);
v.show();
}