咱來聊聊做菜那點事兒
會做菜嗎?還是經常出去吃啊。做菜很重要的一點就是放調料,調料放好了,一盤菜也就活了。但是調料那麼多,怎麼能保證每次都放的合規格呢?且不說合不合格,能不漏掉油鹽就很不錯啦,要是一不小心忘了放鹽,那就很尷尬了。
大家都吃過肯德基麥丹勞吧,像漢堡,不管你什麼時候去吃,它都是那個味道。難道是說做漢堡的師傅心靈手巧?還是做漢堡的步驟就那麼簡單,肉一塊,奶油一塗,倆麪包片啪一拍,一個漢堡出來了?
那肯定是人家有一條嚴格的流水線啊,漢堡的各個部件,都是經過獨立加工,然後由一個小哥將各個部件組合在一起,而最後我們能看到的就是小哥將漢堡拿上櫃臺。
這麼一套流程下來,在設計模式中,就叫“建造者”模式。這個模式具體都涉及到哪些部分呢?首先是各個部件的單獨處理,然後是小哥對各個部件的組合,最後是打包成成品放上櫃臺給你。
對應與“建造者模式”,就是{具體建造類}、{指揮者類}、{產品類}。
“建造者模式”流程圖
建造者模式代碼實現
#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.封裝了具體的步驟,減少了代碼的冗餘。