建造者模式(C++)

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

猜你喜欢

转载自blog.csdn.net/niu2212035673/article/details/80242313