應用Builder模式在C++中進行復雜對象構建

引言

在軟件開發中,構建復雜對象時常常會遇到構造函數或setter方法過于復雜的情況。Builder模式作為一種創建型設計模式,能夠有效地解決這一問題。Guoyao 創建的勇勇(YongYong)角色,通過Builder模式實現了對復雜對象的構建過程與表示的分離,展示了Builder模式在實際項目中的應用。本文將詳細介紹Builder模式在C++中的實現,以及其如何滿足各種面向對象設計原則。

1. Builder模式簡介

Builder模式的核心思想是將復雜對象的構建過程與其表示分離,使得同樣的構建過程可以生成不同的表示。這種分離不僅提高了代碼的靈活性和可維護性,還支持不同的構建策略。

Builder模式主要包括以下幾個角色:

  • Product(產品) :要構建的復雜對象。
  • Builder(構建者) :定義構建Product各個部分的接口。
  • ConcreteBuilder(具體構建者) :實現Builder接口,構建和組裝Product的各個部分。
  • Director(指揮者) :負責管理構建過程,協調各個構建步驟。

2. 勇勇(YongYong)角色的需求分析

勇勇(YongYong)角色需要具備以下屬性:

  • 飯碗(BowlOfRice) :表示勇勇的基本生存需求。
  • 權力(Power) :表示勇勇擁有的權力和影響力。
  • 客戶(Customer) :表示勇勇服務的對象。
  • 小兵(Soldier) :表示勇勇領導的下屬。

通過Builder模式,我們可以分步構建勇勇(YongYong)對象,確保每個部分的構建邏輯清晰且易于擴展。

3. C++代碼實現

3.1 定義各個部分的類

首先,定義勇勇需要的各個部分的類。每個類都提供一個抽象接口,具體實現由子類完成。

// 飯碗類
class BowlOfRice {
public:virtual ~BowlOfRice() = default;virtual void eat() = 0;
};// 權力類
class Power {
public:virtual ~Power() = default;virtual void exercise() = 0;
};// 客戶類
class Customer {
public:virtual ~Customer() = default;virtual void request() = 0;
};// 小兵類
class Soldier {
public:virtual ~Soldier() = default;virtual void obey() = 0;
};

3.2 定義勇勇(YongYong)類

勇勇類包含上述各個部分的指針,并提供一個work()方法來協調各個部分的工作。

class YongYong {
private:BowlOfRice* bowlOfRice;Power* power;Customer* customer;Soldier* soldier;public:YongYong(BowlOfRice* bowl, Power* pow, Customer* cust, Soldier* sold): bowlOfRice(bowl), power(pow), customer(cust), soldier(sold) {}~YongYong() {delete bowlOfRice;delete power;delete customer;delete soldier;}void work() {bowlOfRice->eat();power->exercise();customer->request();soldier->obey();}
};

3.3 定義Builder接口

Builder接口定義了構建勇勇對象各個部分的方法。

class GuoyaoBuilder {
public:virtual ~GuoyaoBuilder() = default;virtual void buildBowlOfRice() = 0;virtual void buildPower() = 0;virtual void buildCustomer() = 0;virtual void buildSoldier() = 0;virtual YongYong* getResult() = 0;
};

3.4 實現具體構建者

具體構建者(Guoyao)實現了Builder接口,構建勇勇對象的各個部分。

class Guoyao : public GuoyaoBuilder {
private:YongYong* yongYong;public:Guoyao() {yongYong = new YongYong(nullptr, nullptr, nullptr, nullptr);}~Guoyao() {delete yongYong;}void buildBowlOfRice() override {yongYong->bowlOfRice = new BowlOfRice() {void eat() override {// 具體實現}};}void buildPower() override {yongYong->power = new Power() {void exercise() override {// 具體實現}};}void buildCustomer() override {yongYong->customer = new Customer() {void request() override {// 具體實現}};}void buildSoldier() override {yongYong->soldier = new Soldier() {void obey() override {// 具體實現}};}YongYong* getResult() override {return yongYong;}
};

3.5 定義指揮者

指揮者(Director)負責管理構建過程,協調各個構建步驟。

class Director {
private:GuoyaoBuilder* guoyao;public:Director(GuoyaoBuilder* g) : guoyao(g) {}~Director() {delete guoyao;}YongYong* construct() {guoyao->buildBowlOfRice();guoyao->buildPower();guoyao->buildCustomer();guoyao->buildSoldier();return guoyao->getResult();}
};

3.6 客戶端代碼

客戶端代碼通過指揮者和構建者來構建勇勇對象,并使用它。

int main() {// 創建具體構建者GuoyaoBuilder* guoyao = new Guoyao();// 創建指揮者Director* director = new Director(guoyao);// 構建勇勇對象YongYong* yongYong = director->construct();// 使用勇勇對象yongYong->work();// 釋放內存delete yongYong;delete director;return 0;
}

4. 面向對象設計原則的滿足情況

Builder模式在實現過程中滿足了多種面向對象設計原則,這些原則有助于提高代碼的靈活性、可擴展性和可維護性。

4.1 單一職責原則(SRP)

  • 描述:一個類應該只有一個改變的原因。
  • 應用:每個類(如BowlOfRicePowerYongYongDirector)只負責一個職責,確保職責明確。

4.2 開閉原則(OCP)

  • 描述:軟件實體應該是開放的擴展,但關閉的修改。
  • 應用:通過定義抽象的GuoyaoBuilder接口,允許通過實現新的Builder類來擴展構建過程,而無需修改現有的DirectorYongYong類。

4.3 里氏替換原則(LSP)

  • 描述:子類應該能夠替換它們的父類而不導致錯誤。
  • 應用:Guoyao實現了GuoyaoBuilder接口,可以替換其父類而不影響Director類的功能。

4.4 依賴倒置原則(DIP)

  • 描述:依賴于抽象而不是具體實現。
  • 應用:Director類依賴于抽象的GuoyaoBuilder接口,而不是具體的實現,符合DIP。

4.5 接口隔離原則(ISP)

  • 描述:客戶端不應該依賴它不需要的接口。
  • 應用:GuoyaoBuilder接口只定義了構建對象所需的最小方法集合,客戶端(如Director類)只需要知道這些方法。

4.6 合成復用原則(CRP)

  • 描述:優先使用組合而不是繼承來實現復用。
  • 應用:通過組合不同的構建步驟來構建復雜對象,而不是通過繼承來復用代碼。

4.7 迪米特法則(Law of Demeter)

  • 描述:一個類應該只與它直接相關的類交互。
  • 應用:Director類只與GuoyaoBuilder接口交互,而不直接與具體的構建部分(如BowlOfRicePower等)交互。

5. 表格總結:Builder模式在C++中的實現步驟和代碼結構

步驟描述代碼實現
1. 定義部分類定義“勇勇”需要的各個部分的類。cpp BowlOfRice, Power, Customer, Soldier
2. 定義“勇勇”類包含各個部分的指針,并提供構建方法。cpp class YongYong
3. 定義Builder接口定義構建各個部分的方法。cpp class GuoyaoBuilder
4. 實現具體構建者實現Builder接口,構建各個部分。cpp class Guoyao
5. 定義指揮者管理構建過程,協調各個構建步驟。cpp class Director
6. 客戶端代碼使用Builder模式構建“勇勇”對象。cpp main()

6. 腦圖展示

以下是用腦圖展示的各個類之間的關系和交互:

graph TDA[Director] --> B[GuoyaoBuilder]B --> C[buildBowlOfRice()]B --> D[buildPower()]B --> E[buildCustomer()]B --> F[buildSoldier()]B --> G[YongYong]G --> H[BowlOfRice]G --> I[Power]G --> J[Customer]G --> K[Soldier]H --> L[eat()]I --> M[exercise()]J --> N[request()]K --> O[obey()]

7. 總結

通過Guoyao創建的勇勇(YongYong)角色,我們展示了Builder模式在C++中的實現。Builder模式通過分離對象的構建過程和表示,提供了一種靈活且可維護的方式來構建復雜對象。通過引入Builder、ConcreteBuilder和Director角色,能夠有效管理構建邏輯,提高代碼的可擴展性和復用性。

本文不僅詳細介紹了Builder模式的實現步驟,還分析了其如何滿足各種面向對象設計原則。希望讀者通過本文能夠更好地理解Builder模式在實際項目中的應用,以及如何通過遵循設計原則來提高代碼質量。

8. 參考資料

  • 《設計模式:可復用面向對象軟件的基礎》(Gang of Four)
  • C++編程規范和最佳實踐 修改一下這篇文章的題目

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

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

相關文章

gradio作為原型工具

存在的問題,頁面的展示和value不是同一個值的問題,比如說選中了北京,但實際上后端想要的是110000地區碼。 在實際開發中,前端展示給用戶的是可讀的地區名稱(如“北京”),而背后處理時通常需要的…

計算聲子譜

準備的還是vasp的必備文件&#xff1a;POSCAR POTCAR KPOINTS&#xff0c;剩下需要的INCAR、band文件下面代碼可以生成&#xff1a;#!/bin/bash if [ ! -f band.conf ];then cat >>band.conf <<EOF ATOM_NAME Ti Al B DIM 1 1 1 BAND 0.0 0.0 0.0 0.5 -0.5 0.5…

深度學習 目標檢測常見指標和yolov1分析

目錄 一、常見指標 1、IoU 2、Confidence置信度 3、精準度和召回率 4、mAP 5、NMS方法 6、檢測速度 前傳耗時 FPS 7、FLOPs 二、YOLOv1 檢測流程 1、圖像網格劃分 2、類別預測 3、輸出張量 損失函數 優點 缺點 如題&#xff0c;這篇介紹一下目標檢測中常見的…

31. 偽類和偽元素區別

總結 選擇對象不同內容說明偽類作用對象元素的狀態或位置偽元素作用對象元素的一部分內容或虛擬內容是否新增節點均不新增節點常用符號:&#xff08;偽類&#xff09;、::&#xff08;偽元素&#xff09;推薦場景偽類用于交互與狀態控制&#xff1b;偽元素用于樣式修飾與內容插…

ChatGPT、Playground手動模擬Agent摘要緩沖混合記憶功能

01. 摘要緩沖混合記憶 摘要緩沖混合記憶中&#xff0c;所需的模塊有&#xff1a; chat_message_history&#xff1a;存儲歷史消息列表。moving_summary_buffer&#xff1a;移除消息的匯總字符串。summary_llm&#xff1a;生成摘要的 LLM&#xff0c;接收 summary&#xff08;…

全國青少年信息素養大賽(無人飛行器主題賽(星際迷航)游記)

作者 FHD_WOLF 發布時間 2025-07-30 21:31 分類 生活游記 騎你的 白馬啊 行你欲行的路 風吹來 花落涂 點一欉香祈求 ---------萬千花蕊慈母悲哀從考場出來&#xff0c;剩下的只有無盡極樂 考前準備&#xff1a; 1.電腦充電。 &#xff08;這個賽項需要自帶設備&#x…

Kubernetes (K8s) 部署資源的完整配置OceanBase

Kubernetes Deployment 配置&#xff08;oceanbase-deployment.yaml&#xff09; # oceanbase-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: oceanbase-deployment spec:replicas: 1selector:matchLabels:app: oceanbasetemplate:metadata:labels:app…

ACS-電機控制Buffer-任意路徑規劃(PVSPLINE繪制圓形)

該程序是一個雙軸運動&#xff0c;繪制圓形 原始程序&#xff08;可以直接使用&#xff09; GLOBAL INT X1,Y1,ii GLOBAL REAL MY_ARRAY(4)(12) GLOBAL REAL piX1 0; Y1 1 ! Axis assignment pi ACOS(-1) ! Shortcut for generating piii 0 LOOP 12MY_ARRAY(0)(ii) COS(…

MongoDB Change Streams 實時數據變更流處理實戰指南

MongoDB Change Streams 實時數據變更流處理實戰指南 業務場景描述 在大型電商平臺或高并發的在線系統中&#xff0c;業務數據的變更&#xff08;如訂單狀態、庫存變動、用戶行為日志&#xff09;需要實時通知下游系統&#xff0c;以便做流式分析、緩存更新或消息推送。傳統的輪…

TIME WEAVER: A Conditional Time Series Generation Model論文閱讀筆記

TIME WEAVER: A Conditional Time Series Generation Model 摘要 想象一下&#xff0c;根據天氣、電動汽車的存在和位置生成一個城市的電力需求模式&#xff0c;這可以用于在冬季凍結期間進行容量規劃。這樣的真實世界的時間序列通常包含配對的異構上下文元數據&#xff08;天氣…

Day 4-2: PyTorch基礎入門 - 從NumPy到深度學習的橋梁

Day 4-2: PyTorch基礎入門 - 從NumPy到深度學習的橋梁 ?? 核心概念(5分鐘理解) 一句話定義 PyTorch是Facebook開發的深度學習框架,將NumPy的數組計算能力擴展到GPU,并加入了自動微分功能,讓構建和訓練神經網絡變得簡單直觀。 為什么重要 GPU加速:比CPU快10-100倍的矩…

法式基因音響品牌SK(SINGKING AUDIO)如何以硬核科技重塑專業音頻版圖

在專業音響的競技場&#xff0c;當多數品牌還在功率參數上纏斗時&#xff0c;一個流淌著法蘭西血液的品牌——SK&#xff08;SINGKING AUDIO&#xff09;&#xff0c;早已構建起令人仰望的技術巔峰。它完美詮釋了真正的聲學藝術&#xff1a;不是技術的炫耀&#xff0c;而是讓尖…

ZooKeeper學習專欄(五):Java客戶端開發(原生API)詳解

文章目錄前言一、核心類解析1.1 ZooKeeper類 - 連接管理核心1.2 Watcher接口 - 事件處理核心二、原生API實踐2.1 創建會話&#xff08;連接管理&#xff09;2.2 創建節點&#xff08;支持多種類型&#xff09;2.3 獲取節點數據和狀態信息2.4 修改節點數據&#xff08;版本控制&…

卸油管鏈接檢測誤報率↓76%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;禁止未經授權的轉載與商用。一、行業痛點&#xff1a;卸油管鏈接檢測的三大技術瓶頸在石化倉儲與運輸場景中&#xff0c;卸油管鏈接的密封性檢測是保障安全生產的關鍵環節。…

MongoDB用戶認證authSource

文章目錄authSource遇到的問題authSource MongoDB用戶認證邏輯與以往我認知的關系型數據庫邏輯不太一樣&#xff0c;多了一層用戶與數據庫關系的綁定。 在建立用戶時&#xff0c;需要先指定數據庫&#xff0c;則存在一個概念&#xff1a;用戶歸屬于數據庫。額外&#xff0c;依…

插件升級:Chat/Builder 合并,支持自定義 Agent、MCP、Rules

TRAE 插件全新升級&#xff0c;Chat、Builder 合并&#xff0c;支持自定義智能體、MCP 及自定義規則&#xff0c;體驗對齊 IDE&#xff0c;現已上線 JetBrains 和 VSCode。 1. Chat/Builder 合并&#xff0c;一個對話框即可智能協作 在 TRAE 插件的 Chat 對話框中&#xff0…

【歷史人物】【王安石】簡歷與生平

目錄 一、王安石個人簡歷 二、個人主要經歷 三、個人成就及影響 1、散文 2、詩歌 3、詞 四、經典評價摘錄 一、王安石個人簡歷 基本信息? 姓名&#xff1a;王安石&#xff0c;字介甫&#xff0c;號半山。小名獾郎 性別&#xff1a;男 年齡&#xff1a;1021年-1086年…

Codeforces Round 1040 (Div. 2) A - D題詳細題解

本文為Codeforces Round 1040 (Div. 2) A - D題的詳細題解, 覺得有幫助或者寫的不錯可以點個贊&#xff01; 目錄 題目A: 題目大意: 解題思路: 代碼(C): 題目B: 題目大意: 解題思路: 代碼(C): 題目C: 題目大意: 解題思路: 代碼(C): 題目D: 題目大意: 解題思路:…

數據結構 之 【排序】(計數排序)

目錄 1.計數排序的思想 2.計數排序圖解 3.計數排序代碼邏輯 3.1求原數組最大最小值及計數數組的創建 3.2計數 3.3覆蓋寫 3.4釋放資源 4.計數排序的注意事項 5.計數排序的時間復雜度與空間復雜度 以升序為例 1.計數排序的思想 前面我們學習的快排、歸并排序、希爾排序.…

Ascend CANN/ACL API 模型部署加速最佳實踐

1. 模型輸入相關問題 圖像尺寸信息 模型輸入尺寸由原始模型決定,在轉換時固定 圖像尺寸信息是模型固有屬性,不是轉換時添加的 對于使用動態尺寸,可以在推理時自動根據當前的輸入尺寸推導輸出尺寸。 輸入格式(NCHW/NHWC) --input_format 不同框架默認格式不同: Caffe: 支持…