簡述
将一個複雜對象的建構與它的表示分離,使同樣的構造過程可以建立不同的表示,
使用者通過指定建造的類型就可以得到它們,而不需要關心具體的建造過程和細節,
場景說明
建造一輛車是比較複雜的,一輛車的部件必須包括車身,輪胎和引擎,但不同車輛的部件是不同的。
比如卡車和小轎車,它們建造流程相同,都需要車身,輪胎和引擎,但它們的建造的部件規格,大小顯然是不同
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();
}