C++,設計模式,【建造者模式】

在這里插入圖片描述

文章目錄

  • 通俗易懂的建造者模式:手把手教你造電腦
    • 一、現實中的建造者困境
    • 二、建造者模式核心思想
    • 三、代碼實戰:組裝電腦
      • 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?? 可視化配置:客戶端代碼像搭積木一樣清晰


五、適用場景速查表

場景適用建造者模式?
對象構造過程復雜??
需要不同表示的同類產品??
構造過程需要分步控制??
簡單對象構造?

六、模式全家福

Director
ComputerBuilder
GamingBuilder
OfficeBuilder
Computer

七、常見誤區提醒

? 不要為了用模式而用模式(簡單對象不需要)
? 當構造過程需要動態變化時,考慮使用工廠模式
? 當出現大量if-else構造代碼時,就是建造者的信號


八、現實應用案例

  1. Java的StringBuilder
  2. SQL查詢構建器(如Hibernate)
  3. LaTeX文檔生成器
  4. 軟件安裝程序的配置向導

掌握建造者模式,就像拿到了對象構造的"樂高說明書"。下次面對復雜對象的組裝需求,試著用這個模式解耦你的代碼,讓系統像模塊化積木一樣靈活可擴展!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78953.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端基礎之《Vue(13)—重要API》

重要的API 一、nextTick() 1、寫法 Vue.$nextTick()或者this.$nextTick() 原因&#xff1a; set操作代碼是同步的&#xff0c;但是代碼背后的行為是異步的。set操作修改聲明式變量&#xff0c;觸發re-render生成新的虛擬DOM&#xff0c;進一步執行diff運算&#xff0c;找到…

Windows 中搭建 browser-use WebUI 1.4

目錄 1. 背景介紹2. 搭建過程3. 補充 1. 背景介紹 背景&#xff1a;想要在 Windows 中復現 browser-use WebUI pickle反序列化漏洞&#xff0c;該漏洞在 v1.7 版本中已經修復&#xff0c;所以需要搭建 小于 1.7 版本的環境&#xff0c;我這里搭建的是 1.4 版本。 項目地址&am…

【數據通信完全指南】從物理層到協議棧的深度解析

目錄 1. 通信技術演進與核心挑戰1.1 從電報到5G的技術變遷1.2 現代通信系統的三大瓶頸 2. 通信系統架構深度解構2.1 OSI七層模型運作原理2.2 TCP/IP協議棧實戰解析 3. 物理層關鍵技術實現3.1 信號調制技術演進路線3.2 信道復用方案對比 4. 數據傳輸可靠性保障4.1 CRC校驗算法數…

CMD與PowerShell:Windows命令行工具的對比與使用指南

CMD與PowerShell&#xff1a;Windows命令行工具的對比與使用指南 文章目錄 CMD與PowerShell&#xff1a;Windows命令行工具的對比與使用指南引言1. CMD&#xff08;命令提示符&#xff09;簡介1.1 什么是CMD&#xff1f;1.2 CMD的特點1.3 常用CMD命令示例1.4 CMD的優勢與局限 2…

93. 后臺線程與主線程更新UI Maui例子 C#例子

在.NET MAUI開發中&#xff0c;多線程是常見的需求&#xff0c;但UI更新必須在主線程上執行。今天&#xff0c;我們來探討一個簡單而優雅的解決方案&#xff1a;MainThread.InvokeOnMainThreadAsync。 一、背景 在跨平臺應用開發中&#xff0c;后臺線程常用于執行耗時操作&am…

海思正式公開了星閃BS21E的SDK

今天海思正式在Gitee平臺發布了BS21E的SDK&#xff1a;fbb_bs2x: fbb_bs2x代碼倉為支持bs21e解決方案SDK。技術論壇&#xff1a;https://developers.hisilicon.com/forum/0133146886267870001 fbb_bs2x代碼倉為支持bs21e解決方案SDK&#xff0c;該SDK包從統一開發平臺FBB&#…

QML學習:使用QML實現抽屜式側邊欄菜單

文章目錄 前言一、環境配置二、實現步驟三、示例完整代碼四、注意事項總結 前言 最近在進行QML的學習&#xff0c;發現一個比較有意思的交互設計&#xff1a;抽屜式側邊欄菜單&#xff0c;出于開發實戰需求&#xff0c;最終實現了一個支持手勢拖拽、彈性動畫、蒙層效果和??智…

峰終定律——AI與思維模型【85】

一、定義 峰終定律思維模型是指人們對一段經歷的評價主要取決于這段經歷中的高峰時刻&#xff08;無論是正向的還是負向的&#xff09;以及結束時的感受&#xff0c;而不是整個經歷的平均感受。也就是說&#xff0c;如果在一段體驗的高峰和結尾階段給人們留下積極、強烈的印象…

【補題】Codeforces Round 664 (Div. 1) A. Boboniu Chats with Du

題意&#xff1a;給出n&#xff0c;d&#xff0c;m三個值&#xff0c;分別代表&#xff0c;有多少個值ai&#xff0c;使用超過m的ai&#xff0c;需要禁言d天&#xff0c;如果不足也能使用&#xff0c;m代表區分點&#xff0c;問能得到最大的值有多少。 思路&#xff1a; …

單片機與上位機串口通信:原理、應用與實踐

注&#xff1a;本文為 “單片機與上位機串口通信” 相關文章合輯。 略作重排&#xff0c;未整理去重。 如有內容異常&#xff0c;請看原文。 單片機與上位機的串行通信 饕餮 tt 于 2019 - 12 - 06 14:47:19 發布 寫在前面 本文主要記錄單片機通過 TXD、RXD 與上位機進行數據…

996引擎-人物模型(UIModel):創建內觀時裝備偏移問題

996引擎-人物模型(UIModel):創建內觀時裝備偏移問題 創建 人物模型(UIModel)問題參考資料創建 人物模型(UIModel) 90、91 是自定義劍甲的穿戴位置,因為需求只需要顯示劍甲,所以下面創建人物模型時,只給了劍甲的id、特效。 function Controller:updateUI()-- 自定義收拾…

Python小程序:上班該做點摸魚的事情

系統提醒 上班會忘記一些自己的事&#xff0c;所以你需要在上班的的時候突然給你彈窗&#xff0c;你就知道要做啥了 源碼 這里有一個智能家居項目可以看看(開源) # -*- coding:utf-8 -*- """ 作者:YTQ 日期: 2025年04日29 21:51:24 """ impor…

centos安裝部署配置kafka

1、解壓到目錄 tar -zxvf kafka_2.13-2.8.2.tgz -C /usr/local/kafka2.進入目錄 cd /usr/local/kafka/kafka_2.13-2.8.23.查看版本&#xff08;驗證是否已解壓&#xff09; bin/kafka-topics.sh --version4.修改配置&#xff0c;注意&#xff1a;此配置中有一個默認的zookee…

深?理解指針(7)

1.函數指針變量的創建 在x86環境下&#xff1a; 我們發現&#xff1a;以函數是有地址的&#xff0c;函數名就是函數的地址&#xff0c;當然也可以通過& 函數名 的?式獲得函數的地址。 如果我們要將函數的地址存放起來&#xff0c;就得創建函數指針變量咯&#xff0c;函數…

AdaBoost算法的原理及Python實現

一、概述 AdaBoost&#xff08;Adaptive Boosting&#xff0c;自適應提升&#xff09;是一種迭代式的集成學習算法&#xff0c;通過不斷調整樣本權重&#xff0c;提升弱學習器性能&#xff0c;最終集成為一個強學習器。它繼承了 Boosting 的基本思想和關鍵機制&#xff0c;但在…

《PyTorch documentation》(PyTorch 文檔)

PyTorch documentation(PyTorch 文檔) PyTorch is an optimized tensor library for deep learning using GPUs and CPUs. (PyTorch是一個優化的張量庫,用于使用GPU和CPU進行深度學習。) Features described in this documentation are classified by release status: (此…

Android學習總結之算法篇六(數組和棧)

括號匹配 public static boolean isValid(String s) {// 創建一個棧用于存儲左括號Stack<Character> stack new Stack<>();// 遍歷字符串中的每個字符for (char c : s.toCharArray()) {if (c ( || c [ || c {) {// 如果是左括號&#xff0c;將其壓入棧中stack…

遺傳算法(Genetic Algorithm,GA)

遺傳算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一種受生物進化理論啟發的優化算法&#xff0c;通過模擬自然選擇和遺傳機制來搜索復雜問題的最優解。 ??核心原理?? ??自然選擇與適者生存??&#xff1a;適應度高的個體更有可能繁殖&#xff0c;將…

消防應急物資智能調用立庫:豪越科技助力消防“速戰速決”

在消防救援的戰場上&#xff0c;時間就是生命&#xff0c;每一秒都關乎著人民群眾的生命財產安全。然而&#xff0c;在過去的緊急救援中&#xff0c;應急物資無法及時到位的情況時有發生&#xff0c;成為制約救援效率的關鍵難題&#xff0c;給救援工作帶來了巨大的困境。 想象一…

【MySQL】數據類型和表的操作

目錄 一. 常用的數據類型 1.數值類型 1.1 整形類型 1.2 浮點型類型 2.字符串類型 char和varchar的區別 如何選擇char和varchar 3.日期類型 4.二進制類型 二. 表的操作 1.查看所有表 2.表的創建 3.查看表的結構 4.表的修改 4.1 添加新的列 4.2 修改表中現有的列 4…