用C++跟你聊聊“建造者模式”

在這裏插入圖片描述

咱來聊聊做菜那點事兒

會做菜嗎?還是經常出去吃啊。做菜很重要的一點就是放調料,調料放好了,一盤菜也就活了。但是調料那麼多,怎麼能保證每次都放的合規格呢?且不說合不合格,能不漏掉油鹽就很不錯啦,要是一不小心忘了放鹽,那就很尷尬了。

大家都吃過肯德基麥丹勞吧,像漢堡,不管你什麼時候去吃,它都是那個味道。難道是說做漢堡的師傅心靈手巧?還是做漢堡的步驟就那麼簡單,肉一塊,奶油一塗,倆麪包片啪一拍,一個漢堡出來了?

那肯定是人家有一條嚴格的流水線啊,漢堡的各個部件,都是經過獨立加工,然後由一個小哥將各個部件組合在一起,而最後我們能看到的就是小哥將漢堡拿上櫃臺。

這麼一套流程下來,在設計模式中,就叫“建造者”模式。這個模式具體都涉及到哪些部分呢?首先是各個部件的單獨處理,然後是小哥對各個部件的組合,最後是打包成成品放上櫃臺給你。
對應與“建造者模式”,就是{具體建造類}、{指揮者類}、{產品類}。

“建造者模式”流程圖

在這裏插入圖片描述

建造者模式代碼實現

#include<iostream>

using namespace std;

//產品類
class Product {
public:
	Product() {}
	~Product() {}

	void setPartA(int param) { this->partA = param; }
	void setPartB(int param) { this->partB = param; }
	void setPartC(int param) { this->partC = param; }

	void show(){
		cout << "partA = " << partA << "、partB = " << partB << "、partC = " << endl;
	}

private:
	int partA;
	int partB;
	int partC;
};

//抽象建造者類(可以理解爲:流程執行的標準)
class AbstractBuilder {
public:
	AbstractBuilder(){}
	virtual ~AbstractBuilder(){}

	virtual void createProduct() = 0;
	virtual void buildPartA(int param) = 0;
	virtual void buildPartB(int param) = 0;
	virtual void buildPartC(int param) = 0;

	virtual Product* getProduct() = 0;
};

//具體建造者類
class Builder : public AbstractBuilder {
public:
	Builder(){}
	~Builder(){}

	void createProduct() {
		cout << "開始生產一個漢堡" << endl;
		curProduct = new Product();
	}
	void buildPartA(int param) { curProduct->setPartA(param); }
	void buildPartB(int param) { curProduct->setPartB(param); }
	void buildPartC(int param) { curProduct->setPartC(param); }

	Product* getProduct() { return curProduct; }

private:
	Product* curProduct;
};

//監工類
class Director
{
public:
	Director(AbstractBuilder* builder) { curBuilder = builder; }
	~Director(){}

	//如果對參數設置有異議,可以自行對監工類的構造函數進行傳參,但是不能過多
	void construct() {
		//按部就班開始
		if (!curBuilder)
			curBuilder->createProduct();
		curBuilder->buildPartA(8);	//比方說,肉要烤八分鐘,我也不知道到底烤多久,隨便吧
		curBuilder->buildPartB(3);	//比方說,奶油擠三圈
		curBuilder->buildPartC(2);	//這個我知道,麪包夾兩片
	}

private:
	AbstractBuilder* curBuilder;
};

int main()
{
	AbstractBuilder* builder = new Builder();
	Director* director = new Director(builder);

	director->construct();

	Product* product = builder->getProduct();
	product->show();
	return 0;
}

適用場景

要求構建產品的步驟(算法)是不能劇烈變化的,最好是不變的,這樣就影響了靈活度。

優點

1.隔離了構建的步驟和具體的實現,爲產品的具體實現提供了靈活度。

2.封裝和抽象了每個步驟的實現,實現了依賴倒轉原則。

3.封裝了具體的步驟,減少了代碼的冗餘。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章