C++ 建造者模式 - 組裝電腦

建造者模式(Builder Pattern),旨在將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
1
模式結(jié)構(gòu)
UML 結(jié)構(gòu)圖:

Builder(抽象建造者):為創(chuàng)建一個產(chǎn)品對象的各個部件指定抽象接口。
ConcreteBuilder(具體建造者):實現(xiàn) Builder 的接口以構(gòu)造和裝配該產(chǎn)品的各個部件,定義并明確它所創(chuàng)建的表示,并提供一個檢索產(chǎn)品的接口。
Director(指揮者):構(gòu)造一個使用 Builder 接口的對象。
Product(產(chǎn)品):表示被構(gòu)造的復(fù)雜對象。ConcreteBuilder 創(chuàng)建該產(chǎn)品的內(nèi)部表示并定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產(chǎn)品的接口。
2
優(yōu)缺點
建造者獨立,易于擴(kuò)展
便于控制細(xì)節(jié)風(fēng)險
產(chǎn)品必須有共同點,范圍有限制
如果內(nèi)部變化復(fù)雜,將會有很多的建造類
3
適用場景
需要生成的對象具有復(fù)雜的內(nèi)部結(jié)構(gòu)
需要生成的對象內(nèi)部屬性本身相互依賴
4
案例分析
Lenovo For Those Who Do - 聯(lián)想

聯(lián)想旗下有眾多系列的電腦,例如:ThinkPad、Yoga ...... 在科技創(chuàng)新的大潮下,產(chǎn)品層出不窮。電腦雖多,但結(jié)構(gòu)基本一致,都是由 CPU、主板、內(nèi)存、顯卡等組成。如果為每臺電腦都單獨設(shè)計一個組裝流程,管理的成本太高。這時,建造者模式就出現(xiàn)了,為所有系列指定一個統(tǒng)一的組裝流程,所有的電腦都按照這個流程來組裝。
5
代碼實現(xiàn)
這里的產(chǎn)品是 Computer,包含了 CPU、主板、內(nèi)存、顯卡等信息。
#ifndef PRODUCT_H
#define PRODUCT_H
#include <iostream>
using namespace std;
// 電腦
class Computer
{
public:
void SetCpu(string cpu) { m_strCpu = cpu;}
void SetMainboard(string mainboard) { m_strMainboard = mainboard; }
void SetRam(string ram) { m_strRam = ram; }
void SetVideoCard(string videoCard) { m_strVideoCard = videoCard; }
string GetCPU() { return m_strCpu; }
string GetMainboard() { return m_strMainboard; }
string GetRam() { return m_strRam; }
string GetVideoCard() { return m_strVideoCard; }
private:
string m_strCpu; // CPU
string m_strMainboard; // 主板
string m_strRam; // 內(nèi)存
string m_strVideoCard; // 顯卡
};
#endif // PRODUCT_H
電腦準(zhǔn)備好之后,就可以定義組裝流程了,由 Builder 來表示。
#ifndef BUILDER_H
#define BUILDER_H
#include "product.h"
// 建造者接口,組裝流程
class IBuilder
{
public:
virtual void BuildCpu() = 0; // 創(chuàng)建 CPU
virtual void BuildMainboard() = 0; // 創(chuàng)建主板
virtual void BuildRam() = 0; // 創(chuàng)建內(nèi)存
virtual void BuildVideoCard() = 0; // 創(chuàng)建顯卡
virtual Computer* GetResult() = 0; // 獲取建造后的產(chǎn)品
};
#endif // BUILDER_H
接下來,就是讓 ConcreteBuilder 就位。在這些組裝者中,可以指定每臺電腦要使用的具體部件。
#ifndef CONCRETE_BULIDER_H
#define CONCRETE_BULIDER_H
#include "builder.h"
// ThinkPad 系列
class ThinkPadBuilder : public IBuilder
{
public:
ThinkPadBuilder() { m_pComputer = new Computer(); }
void BuildCpu() override { m_pComputer->SetCpu("i5-6200U"); }
void BuildMainboard() override { m_pComputer->SetMainboard("Intel DH57DD"); }
void BuildRam() override { m_pComputer->SetRam("DDR4"); }
void BuildVideoCard() override { m_pComputer->SetVideoCard("NVIDIA Geforce 920MX"); }
Computer* GetResult() override { return m_pComputer; }
private:
Computer *m_pComputer;
};
// Yoga 系列
class YogaBuilder : public IBuilder
{
public:
YogaBuilder() { m_pComputer = new Computer(); }
void BuildCpu() override { m_pComputer->SetCpu("i7-7500U"); }
void BuildMainboard() override { m_pComputer->SetMainboard("Intel DP55KG"); }
void BuildRam() override { m_pComputer->SetRam("DDR5"); }
void BuildVideoCard() override { m_pComputer->SetVideoCard("NVIDIA GeForce 940MX"); }
Computer* GetResult() override { return m_pComputer; }
private:
Computer *m_pComputer;
};
#endif // CONCRETE_BULIDER_H
聯(lián)想要生產(chǎn)電腦了,直接委派給組裝者,開干。
#ifndef DIRECTOR_H
#define DIRECTOR_H
#include "builder.h"
// 構(gòu)造指揮官
class Direcror
{
public:
void Create(IBuilder *builder) {
builder->BuildCpu();
builder->BuildMainboard();
builder->BuildRam();
builder->BuildVideoCard();
}
};
#endif // DIRECTOR_H
現(xiàn)在,一起來看看客戶端,創(chuàng)建任何產(chǎn)品都非常干凈。
#include "concrete_bulider.h"
#include "director.h"
#include <string>
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{
Direcror *pDirecror = new Direcror();
ThinkPadBuilder *pTPBuilder = new ThinkPadBuilder();
YogaBuilder *pYogaBuilder = new YogaBuilder();
// 組裝 ThinkPad、Yoga
pDirecror->Create(pTPBuilder);
pDirecror->Create(pYogaBuilder);
// 獲取組裝后的電腦
Computer *pThinkPadComputer = pTPBuilder->GetResult();
Computer *pYogaComputer = pYogaBuilder->GetResult();
// 測試輸出
cout << "-----ThinkPad-----" << endl;
cout << "CPU: " << pThinkPadComputer->GetCPU() << endl;
cout << "Mainboard: " << pThinkPadComputer->GetMainboard() << endl;
cout << "Ram: " << pThinkPadComputer->GetRam() << endl;
cout << "VideoCard: " << pThinkPadComputer->GetVideoCard() << endl;
cout << "-----Yoga-----" << endl;
cout << "CPU: " << pYogaComputer->GetCPU() << endl;
cout << "Mainboard: " << pYogaComputer->GetMainboard() << endl;
cout << "Ram: " << pYogaComputer->GetRam() << endl;
cout << "VideoCard: " << pYogaComputer->GetVideoCard() << endl;
SAFE_DELETE(pThinkPadComputer);
SAFE_DELETE(pYogaComputer);
SAFE_DELETE(pTPBuilder);
SAFE_DELETE(pYogaBuilder);
SAFE_DELETE(pDirecror);
getchar();
return 0;
}
輸出如下:
-----ThinkPad-----
CPU: i5-6200U
Mainboard: Intel DH57DD
Ram: DDR4
VideoCard: NVIDIA Geforce 920MX
-----Yoga-----
CPU: i7-7500U
Mainboard: Intel DP55KG
Ram: DDR5
VideoCard: NVIDIA GeForce 940MX
·················· END ··················
關(guān)注后回復(fù)「1024」,獲取海量學(xué)習(xí)資源

