重溫設計模式--建造者模式

文章目錄

  • 建造者模式(Builder Pattern)概述
  • 建造者模式UML圖
  • 作用:
  • 建造者模式的結構
    • 產品(Product):
    • 抽象建造者(Builder):
    • 具體建造者(Concrete Builder):
    • 指揮者(Director):
  • C++ 代碼示例1
  • C++示例代碼2

建造者模式(Builder Pattern)概述

定義:
建造者模式是一種創建型設計模式,它將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。也就是說,它把對象的創建邏輯和表示邏輯分離開來,讓代碼結構更加清晰,便于維護和擴展。

建造者模式UML圖

在這里插入圖片描述

作用:

便于創建復雜對象:對于那些具有多個屬性、構造過程比較復雜的對象,使用建造者模式可以分步來構建對象,使創建過程更有條理。例如,創建一個包含多個部件的電腦對象,要配置 CPU、內存、硬盤等多種組件,通過建造者模式能清晰地完成配置過程。
提高代碼的可維護性和可讀性:把對象構建的各個步驟封裝在不同的方法中,相比于在構造函數中羅列大量參數或者在一個方法里寫復雜的初始化邏輯,代碼結構更加清晰,后續閱讀和維護代碼時更容易理解對象的構建流程。
實現不同的構建配置:可以通過不同的建造者實現來創建對象的不同配置版本,比如對于一款游戲角色,可以創建不同屬性配置的角色實例,滿足不同場景需求。

建造者模式的結構

產品(Product):

這是最終要創建的復雜對象,它通常包含多個部件或者屬性,比如上述提到的電腦對象,其內部有 CPU、內存、硬盤等不同的成員變量來構成完整的電腦實體。

抽象建造者(Builder):

它定義了創建產品各個部件的抽象方法,以及返回最終產品對象的抽象方法。比如對于電腦的抽象建造者,會有抽象的配置 CPU、配置內存等方法,還有獲取構建好的電腦的抽象方法。

具體建造者(Concrete Builder):

實現了抽象建造者中定義的抽象方法,具體地來構建產品的各個部件,按照特定的邏輯和配置完成產品的組裝,每個具體建造者可以創建出具有不同配置特點的產品。

指揮者(Director):

它負責指揮建造者進行對象的構建,通過調用建造者的相關方法來按順序完成產品的創建過程,不過它并不關心具體的構建細節,只是協調構建步驟。

C++ 代碼示例1

以下以創建一個簡單的電腦對象為例來展示建造者模式的代碼實現:

#include<iostream>
#include<string>// 產品類:電腦
class Computer
{
private:std::string cpu;int memory;int hardDisk;
public:void setCpu(const std::string& cpu){this->cpu = cpu;}void setMemory(int memory){this->memory = memory;}void setHardDisk(int hardDisk){this->hardDisk = hardDisk;}void showInfo(){std::cout << "CPU: " << cpu << std::endl;std::cout << "Memory: " << memory << "GB" << std::endl;std::cout << "Hard Disk: " << hardDisk << "GB" << std::endl;}
};// 抽象建造者類
class ComputerBuilder
{
public:virtual void buildCpu() = 0;virtual void buildMemory() = 0;virtual void buildHardDisk() = 0;virtual Computer* getComputer() = 0;
};// 具體建造者類,創建高配電腦
class HighEndComputerBuilder :public ComputerBuilder 
{
private:Computer* computer;
public:HighEndComputerBuilder() {computer = new Computer();}void buildCpu() override{computer->setCpu("Intel Core i9");}void buildMemory() override{computer->setMemory(32);}void buildHardDisk() override{computer->setHardDisk(1024);}Computer* getComputer() override{return computer;}
};// 具體建造者類,創建低配電腦
class LowEndComputerBuilder :	public ComputerBuilder
{
private:Computer* computer;
public:LowEndComputerBuilder(){computer = new Computer();}void buildCpu() override {computer->setCpu("Intel Core i3");}void buildMemory() override {computer->setMemory(8);}void buildHardDisk() override{computer->setHardDisk(256);}Computer* getComputer() override{return computer;}
};// 指揮者類
class Director
{
private:ComputerBuilder* builder;
public:void setBuilder(ComputerBuilder* builder) {this->builder = builder;}Computer* construct(){builder->buildCpu();builder->buildMemory();builder->buildHardDisk();return builder->getComputer();}
};int main()
{Director director;// 創建高配電腦HighEndComputerBuilder highEndBuilder;director.setBuilder(&highEndBuilder);Computer* highEndComputer = director.construct();highEndComputer->showInfo();// 創建低配電腦LowEndComputerBuilder lowEndBuilder;director.setBuilder(&lowEndBuilder);Computer* lowEndComputer = director.construct();lowEndComputer->showInfo();delete highEndComputer;delete lowEndComputer;return 0;
}

在上述代碼中:
Computer類就是產品類,代表要構建的電腦對象,有設置各部件屬性和展示自身信息的方法。
ComputerBuilder是抽象建造者,定義了構建電腦各部件及獲取電腦對象的抽象方法。
HighEndComputerBuilder和LowEndComputerBuilder是具體建造者,分別按照高配和低配的配置來構建電腦對象。
Director類作為指揮者,通過調用建造者的方法來協調完成電腦對象的構建過程,最終客戶端代碼(main函數中)可以方便地通過指揮者和不同的建造者配合,創建出不同配置的電腦對象,整個創建過程條理清晰,易于擴展和維護。

C++示例代碼2

#include<iostream>
#include<list>
#include<string>
using namespace std;class product
{list<string>ls;
public:void add(string m_str){ls.push_back(m_str);}void show(){list<string>::iterator itr = ls.begin();for(;itr!=ls.end();++itr){cout<<*itr<<endl;}}
};
class builder
{
public:virtual void head(){};virtual void body(){};virtual void leg(){};virtual void hand(){};virtual product getresult(){product s;return s;};
};class  conbuild1:public builder
{
private:product *m_product;
public:conbuild1(){m_product = new product();}void head(){m_product->add("1的頭");}void body(){m_product->add("1的身體");}void leg(){m_product->add("1的腿");}void hand(){m_product->add("1的手");}product getresult(){return *m_product;}
};class  conbuild2:public builder
{
private:product *m_product;
public:conbuild2(){m_product = new product();}void head(){m_product->add("2的頭");}void body(){m_product->add("2的身體");}void leg(){m_product->add("2的腿");}void hand(){m_product->add("2的手");}product getresult(){return *m_product;}
};class director
{
public:void createpeople(builder *s){s->body();s->hand();s->leg();s->head();}
};int main()
{director s;builder *p1 = new conbuild1;builder*p2 = new conbuild2;s.createpeople(p1);product s1 = p1->getresult();s1.show();cout<<"---------------"<<endl;s.createpeople(p2);product s2 = p2->getresult();s2.show();
}

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

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

相關文章

每日一題(4)

有一只蝸牛位于二維坐標系的原點(0,0)&#xff0c;在x軸上有n根平行于y軸的竹竿&#xff0c;它們底部的縱坐標為0&#xff0c;橫坐標分別為x_1,x_2,\cdots,x_n。蝸牛想要從原點走到第n根竹竿的底部(x_n,0)。蝸牛在x軸上的移動速度是1單位每秒&#xff0c;在竹竿上向上爬的速度是…

arcgisPro相接多個面要素轉出為完整獨立線要素

1、使用【面轉線】工具&#xff0c;并取消勾選“識別和存儲面鄰域信息”&#xff0c;如下&#xff1a; 2、得到的線要素&#xff0c;如下&#xff1a;

51單片機仿真搖號抽獎機源程序 12864液晶顯示

資料下載地址&#xff1a;51單片機仿真搖號抽獎機源程序12864液晶顯示仿真程序 一、功能介紹 單片機連接12864&#xff08;st7920&#xff09;液晶顯示器和1個按鍵接INT0&#xff0c;模擬一個抽獎機。 實現效果&#xff1a; 1、液晶初始顯示“祝你好運&#xff01;”&#xff…

如何在 Ubuntu 22.04 上安裝 Graylog 開源日志管理平臺

簡介 Graylog 的開源特性、豐富的功能、靈活性和可擴展性使其成為一個流行的日志管理平臺。在本教程中&#xff0c;我將向你展示如何在 Ubuntu 22.04 上安裝 Graylog&#xff0c;包括配置 Graylog 服務器軟件包和訪問 Graylog Web UI。 Graylog 是什么&#xff1f; Graylog …

技術發展歷程:從 CORBA 到微服務

CORBA CORBA&#xff08;Common Object Request Broker Architecture&#xff09;誕生于上世紀 90 年代初期&#xff0c;由 OMG 組織提出&#xff0c;它作為一種開創性的分布式對象技術規范&#xff0c;在當時的計算機領域引起了轟動。其核心構成部分——接口定義語言&#xf…

搶單人機交互「新紅利」!哪些細分賽道“多金”?

受終端用戶的智能座艙體驗需求驅動&#xff0c;視覺、聽覺、觸覺等人機交互方式加速煥新。 一方面&#xff0c;人機多模交互引領&#xff0c;車載聲學進入新周期。根據高工智能汽車研究院統計數據&#xff0c;單車的車載揚聲器搭載量正在快速起量。 很顯然&#xff0c;作為智…

記錄vue+elementUI table的組件

可展示圖片&#xff0c; 可使用slot插槽添加邏輯&#xff0c; 循環表cloumn&#xff0c; 循環添加操作配置actionButtons <el-tablev-loading"loading":data"tableData"borderstyle"width: 100%"selection-change"selectChange"…

圖像配準有哪些技術?

目錄 圖像配準技術 1.基于特征的圖像配準 2.基于強度的圖像配準 3.基于模型的圖像配準 4.基于學習的圖像配準 5.混合方法 圖像配準的應用 圖像配準技術入門 常見問題解答 圖像配準是計算機視覺和醫學成像中的一項關鍵技術&#xff0c;用于將多幅圖像對齊到一個共同的坐…

前端學習DAY26(華為平板頁面)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>平板圖片</title><style> .box{text-al…

算法 雙指針技巧

文章目錄 雙指針[leetcode167 兩數之和](https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/description/)分析題解 [leetcode88 合并兩個有序數組](https://leetcode.cn/problems/merge-sorted-array/description/)分析題解 [leetcode142 環形鏈表](https://lee…

DevOps工程技術價值流:制品庫Nexus與Harbor的實戰探索

制品庫作為DevOps價值流中的一個關鍵環節&#xff0c;其重要性日益凸顯。制品庫&#xff0c;作為存儲和管理軟件開發過程中產生的各種制品&#xff08;如代碼包、鏡像、配置文件等&#xff09;的倉庫&#xff0c;是連接開發、測試、部署等多個環節的橋梁。它不僅能夠實現制品的…

R9000P鍵盤失靈解決辦法

問題描述 突然&#xff0c;就是很突然&#xff0c;我買的R9000P 2024不到三個月&#xff0c;鍵盤突然都不能用了&#xff0c;是所有鍵盤按鍵都無效的那種。&#xff08;可以使用外接鍵盤&#xff09; 解決辦法 我本科室友說的好哈&#xff0c;全壞全沒壞。 &#xff08;該解…

潛在狄利克雷分配LDA 算法深度解析

引言 潛在狄利克雷分配&#xff08;Latent Dirichlet Allocation, LDA&#xff09;是一種廣泛應用于文本挖掘和信息檢索領域的主題模型。它能夠從文檔集合中自動發現隱藏的主題結構&#xff0c;為理解大規模文本數據提供了強有力的工具。本文將著重講解 LDA 的核心理論&#x…

使用正則表達式提取PDF文件頁數的實現方案

文章目錄 背景介紹實現原理代碼實現1. 基礎函數結構2. 頁數提取邏輯3. 使用示例 正則表達式解析優點與局限性優點局限性 錯誤處理建議性能優化建議最佳實踐建議總結參考資源 背景介紹 在Web應用開發中,我們經常需要獲取上傳PDF文件的頁數信息。雖然可以使用pdf.js等第三方庫,但…

sentinel學習筆記6-限流降級(上)

本文屬于sentinel學習筆記系列。網上看到吳就業老師的專欄&#xff0c;寫的好值得推薦&#xff0c;我整理的有所刪減&#xff0c;推薦看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 實現限流降級、熔斷降級、黑白名單限流降級、系統自適應…

全面解析 Kubernetes 流量負載均衡:iptables 與 IPVS 模式

目錄 Kubernetes 中 Service 的流量負載均衡模式 1. iptables 模式 工作原理 數據路徑 優點 缺點 適用場景 2. IPVS 模式 工作原理 數據路徑 優點 缺點 適用場景 兩種模式的對比 如何切換模式 啟用 IPVS 模式 驗證模式 總結 Kubernetes 中 Service 的流量負載…

每日十題八股-2024年12月19日

1.Bean注入和xml注入最終得到了相同的效果&#xff0c;它們在底層是怎樣做的&#xff1f; 2.Spring給我們提供了很多擴展點&#xff0c;這些有了解嗎&#xff1f; 3.MVC分層介紹一下&#xff1f; 4.了解SpringMVC的處理流程嗎&#xff1f; 5.Handlermapping 和 handleradapter有…

藍橋杯嵌入式備賽教程(1、led,2、lcd,3、key)

一、工程模版創建流程 第一步 創建新項目 第二步 選擇型號和管腳封裝 第三步 RCC使能 外部時鐘&#xff0c;高速外部時鐘 第四步晶振時鐘配置 由數據手冊7.1可知外部晶振頻率為24MHz 最后一項設置為80 按下回車他會自動配置時鐘 第五步&#xff0c;如果不勾選可能程序只會…

詳細解讀sedex驗廠

SEDEX驗廠&#xff0c;即供貨商商業道德信息交流認證&#xff08;Supplier Ethical Data Exchange&#xff09;&#xff0c;是一種表明企業遵守商業道德的認證。以下是對SEDEX驗廠的詳細解讀&#xff1a; 一、SEDEX驗廠概述 SEDEX是一家總部位于英國倫敦的非營利組織&#xf…

2.4 設備管理

文章目錄 設備管理概述設備管理技術磁盤調度 設備管理概述 設備管理是操作系統中最繁雜、與硬件關系緊密的部分。 設備可以按照數據組織、資源分配、數據傳輸率分類。 數據組織&#xff1a;分為塊設備&#xff08;ex. 磁盤&#xff09;、字符設備(ex. 打印機)。資源分配&#…