天天看點

建造者模式(C++)

簡述

将一個複雜對象的建構與它的表示分離,使同樣的構造過程可以建立不同的表示,

使用者通過指定建造的類型就可以得到它們,而不需要關心具體的建造過程和細節,

場景說明

建造一輛車是比較複雜的,一輛車的部件必須包括車身,輪胎和引擎,但不同車輛的部件是不同的。

比如卡車和小轎車,它們建造流程相同,都需要車身,輪胎和引擎,但它們的建造的部件規格,大小顯然是不同

UML類圖

建造者模式(C++)

對象說明

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();
}
           

繼續閱讀