简述
将一个复杂对象的构建与它的表示分离,使同样的构造过程可以创建不同的表示,
用户通过指定建造的类型就可以得到它们,而不需要关心具体的建造过程和细节,
场景说明
建造一辆车是比较复杂的,一辆车的部件必须包括车身,轮胎和引擎,但不同车辆的部件是不同的。
比如卡车和小轿车,它们建造流程相同,都需要车身,轮胎和引擎,但它们的建造的部件规格,大小显然是不同
UML类图
将一个复杂对象的构建与它的表示分离,使同样的构造过程可以创建不同的表示,
用户通过指定建造的类型就可以得到它们,而不需要关心具体的建造过程和细节,
场景说明
建造一辆车是比较复杂的,一辆车的部件必须包括车身,轮胎和引擎,但不同车辆的部件是不同的。
比如卡车和小轿车,它们建造流程相同,都需要车身,轮胎和引擎,但它们的建造的部件规格,大小显然是不同
UML类图
对象说明
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(); }