文章目錄
- 通俗易懂的建造者模式:手把手教你造電腦
- 一、現實中的建造者困境
- 二、建造者模式核心思想
- 三、代碼實戰:組裝電腦
- 1. 產品類 - 電腦
- 2. 抽象建造者 - 裝機師傅
- 3. 具體建造者 - 電競主機版
- 4. 具體建造者 - 辦公主機版
- 5. 指揮官 - 裝機總控
- 6. 客戶端使用
- 四、模式優勢解析
- 五、適用場景速查表
- 六、模式全家福
- 七、常見誤區提醒
- 八、現實應用案例
通俗易懂的建造者模式:手把手教你造電腦
一、現實中的建造者困境
想象你開了一家電腦組裝店,客戶經常提出這樣的需求:
"我要i7處理器+32G內存+RTX4090顯卡的電競主機"
"給我配個i5處理器+16G內存+核顯的辦公機"
"這個配置能不能換成1TB固態硬盤?"
直接在代碼里寫N個if-else會變成這樣:
Computer buildComputer(string type) {Computer c;if (type == "gaming") {c.cpu = "i7";c.ram = "32G";//...其他20個部件配置} else if (type == "office") {//...重復代碼}return c;
}
當需要新增配置項時,所有條件分支都要修改。這時候就需要【建造者模式】登場了!
二、建造者模式核心思想
將復雜對象的構建過程與它的表示分離,讓同樣的構建過程可以創建不同的表示。
🌰 舉個栗子:
就像樂高積木,同樣的基礎零件(CPU/內存/硬盤),通過不同的搭建順序(建造者),可以造出賽車(游戲電腦)或房屋(辦公電腦)。
三、代碼實戰:組裝電腦
1. 產品類 - 電腦
class Computer {
public:void setCPU(string cpu) { this->cpu = cpu; }void setRAM(string ram) { this->ram = ram; }void setGPU(string gpu) { this->gpu = gpu; }void showConfig() {cout << "【電腦配置】\n"<< "CPU: "<< cpu << "\n"<< "內存: "<< ram << "\n"<< "顯卡: "<< gpu << endl;}private:string cpu = "i3";string ram = "8G";string gpu = "集成顯卡";
};
2. 抽象建造者 - 裝機師傅
class ComputerBuilder {
public:virtual ~ComputerBuilder() = default;virtual void buildCPU() = 0;virtual void buildRAM() = 0;virtual void buildGPU() = 0;virtual Computer* getComputer() = 0;
};
3. 具體建造者 - 電競主機版
class GamingComputerBuilder : public ComputerBuilder {Computer* computer = new Computer();public:void buildCPU() override { computer->setCPU("i7-13700K"); }void buildRAM() override { computer->setRAM("32G DDR5"); }void buildGPU() override { computer->setGPU("RTX 4090"); }Computer* getComputer() override { return computer; }
};
4. 具體建造者 - 辦公主機版
class OfficeComputerBuilder : public ComputerBuilder {Computer* computer = new Computer();public:void buildCPU() override { computer->setCPU("i5-12400"); }void buildRAM() override { computer->setRAM("16G DDR4"); }void buildGPU() override { /* 使用核顯 */ }Computer* getComputer() override { return computer; }
};
5. 指揮官 - 裝機總控
class Director {ComputerBuilder* builder;public:void setBuilder(ComputerBuilder* b) { builder = b; }Computer* construct() {builder->buildCPU();builder->buildRAM();builder->buildGPU();return builder->getComputer();}
};
6. 客戶端使用
int main() {Director director;// 組裝電競主機director.setBuilder(new GamingComputerBuilder());Computer* gamingPC = director.construct();gamingPC->showConfig();// 組裝辦公主機director.setBuilder(new OfficeComputerBuilder());Computer* officePC = director.construct();officePC->showConfig();return 0;
}
四、模式優勢解析
1?? 解耦復雜度:把20個配置項分散到不同建造者中
2?? 開閉原則:新增配置項只需加建造者,不改現有代碼
3?? 去重復:組裝流程統一在Director中管理
4?? 可視化配置:客戶端代碼像搭積木一樣清晰
五、適用場景速查表
場景 | 適用建造者模式? |
---|---|
對象構造過程復雜 | ?? |
需要不同表示的同類產品 | ?? |
構造過程需要分步控制 | ?? |
簡單對象構造 | ? |
六、模式全家福
七、常見誤區提醒
? 不要為了用模式而用模式(簡單對象不需要)
? 當構造過程需要動態變化時,考慮使用工廠模式
? 當出現大量if-else構造代碼時,就是建造者的信號
八、現實應用案例
- Java的StringBuilder
- SQL查詢構建器(如Hibernate)
- LaTeX文檔生成器
- 軟件安裝程序的配置向導
掌握建造者模式,就像拿到了對象構造的"樂高說明書"。下次面對復雜對象的組裝需求,試著用這個模式解耦你的代碼,讓系統像模塊化積木一樣靈活可擴展!