95、23種設計模式之建造者模式(4/23)

建造者模式(Builder Pattern)是23種經典設計模式中的創建型模式之一,其核心思想是將復雜對象的構建過程與其表示分離,使得同樣的構建流程可以生成不同結構或配置的對象。以下從定義、結構、應用場景、優缺點及代碼示例展開分析:

一、模式定義

建造者模式通過分步構建復雜對象,將對象的構造邏輯(如部件創建、組裝順序)封裝在獨立的建造者類中,客戶端只需指定建造者類型即可獲得最終產品,無需了解內部細節。
類比:如同在餐廳點餐,顧客只需選擇套餐類型(如A套餐、B套餐),廚師(建造者)會按固定流程準備食材(部件)并組合成完整餐品(產品)。

二、模式結構

建造者模式通常包含以下角色:

1.產品(Product)

復雜對象,由多個部件組成(如汽車由引擎、輪胎、車身等部件構成)。

2.抽象建造者(Builder)

定義創建產品各部件的抽象方法(如buildEngine()、buildWheel()),并提供獲取最終產品的方法(如getVehicle())。

3.具體建造者(ConcreteBuilder)

實現抽象建造者接口,具體定義部件的創建和組裝邏輯,返回不同配置的產品實例。

4.指揮者(Director)

封裝構建流程,調用建造者的方法按固定順序組裝產品(可選角色,客戶端也可直接調用建造者)。

三、應用場景

1.復雜對象構造

對象由多個部件構成,且部件創建步驟復雜(如計算機組裝需選擇CPU、內存、硬盤等)。

2.相同流程不同表示

構建過程穩定,但部件組合方式多樣(如汽車可組裝為SUV、跑車等不同型號)。

3.隔離構造與使用

客戶端無需關心對象內部細節,只需關注最終產品(如通過StringBuilder.append()逐步構建字符串,最后調用toString()獲取結果)。

4.可選部件處理

對象包含可選屬性,避免使用冗長的構造函數或Setter方法(如通過鏈式調用設置對象屬性)。

四、優缺點分析

1.優點

(1)解耦構建與表示:客戶端無需知道產品內部結構,只需指定建造者類型。
(2)擴展性強:新增具體建造者不影響現有代碼,符合開閉原則。
(3)控制構建細節:可靈活調整部件創建順序或條件(如根據配置選擇引擎類型)。

2.缺點

(1)類數量增加:需定義抽象建造者、具體建造者等額外類,系統復雜度上升。
(2)維護成本高:若產品內部結構變化,所有建造者均需修改。
(3)適用范圍有限:僅適用于部件數量多、構造過程復雜的對象。

五、代碼示例(C#)

以下是一個 完整的 C# 建造者模式示例,包含 產品類、抽象建造者、具體建造者、指揮者 和 客戶端調用,并支持 鏈式調用:

using System;// 1. 產品類(Computer)
public class Computer
{public string CPU { get; set; }public string RAM { get; set; }public string Storage { get; set; }public string GPU { get; set; }public bool HasKeyboard { get; set; }public bool HasMouse { get; set; }public override string ToString(){return $@"
Computer Configuration:CPU: {CPU}RAM: {RAM}Storage: {Storage}GPU: {GPU}Keyboard: {(HasKeyboard ? "Included" : "Not Included")}Mouse: {(HasMouse ? "Included" : "Not Included")}";}
}// 2. 抽象建造者(IComputerBuilder)
public interface IComputerBuilder
{IComputerBuilder SetCPU(string cpu);IComputerBuilder SetRAM(string ram);IComputerBuilder SetStorage(string storage);IComputerBuilder SetGPU(string gpu);IComputerBuilder IncludeKeyboard(bool include);IComputerBuilder IncludeMouse(bool include);Computer Build();
}// 3. 具體建造者(GamingComputerBuilder)
public class GamingComputerBuilder : IComputerBuilder
{private Computer _computer = new Computer();public IComputerBuilder SetCPU(string cpu) { _computer.CPU = cpu; return this; }public IComputerBuilder SetRAM(string ram) { _computer.RAM = ram; return this; }public IComputerBuilder SetStorage(string storage) { _computer.Storage = storage; return this; }public IComputerBuilder SetGPU(string gpu) { _computer.GPU = gpu; return this; }public IComputerBuilder IncludeKeyboard(bool include) { _computer.HasKeyboard = include; return this; }public IComputerBuilder IncludeMouse(bool include) { _computer.HasMouse = include; return this; }public Computer Build() { return _computer; }
}// 4. 指揮者(ComputerDirector)
public class ComputerDirector
{public Computer BuildGamingPC(IComputerBuilder builder){return builder.SetCPU("AMD Ryzen 9 5900X").SetRAM("64GB DDR4").SetStorage("2TB NVMe SSD").SetGPU("NVIDIA RTX 3080 Ti").IncludeKeyboard(true).IncludeMouse(true).Build();}public Computer BuildOfficePC(IComputerBuilder builder){return builder.SetCPU("Intel i5").SetRAM("16GB DDR4").SetStorage("512GB SSD").SetGPU("Integrated Graphics").IncludeKeyboard(false).IncludeMouse(false).Build();}
}// 5. 客戶端代碼
class Program
{static void Main(){// 使用指揮者構建標準配置var director = new ComputerDirector();var builder = new GamingComputerBuilder();Computer gamingPC = director.BuildGamingPC(builder);Computer officePC = director.BuildOfficePC(builder);Console.WriteLine("=== Standard Gaming PC ===");Console.WriteLine(gamingPC);Console.WriteLine("\n=== Standard Office PC ===");Console.WriteLine(officePC);// 直接鏈式調用自定義配置Computer customPC = new GamingComputerBuilder().SetCPU("Apple M1 Ultra").SetRAM("128GB").SetStorage("8TB SSD").SetGPU("AMD Radeon Pro").IncludeKeyboard(true).Build();Console.WriteLine("\n=== Custom PC ===");Console.WriteLine(customPC);}
}

關鍵設計點

1.鏈式調用

通過返回 IComputerBuilder 實現流暢接口(如 SetCPU().SetRAM().Build())。

2.指揮者

封裝固定構建流程(如 BuildGamingPC()),適合重復性構造。

3.靈活性

既可通過指揮者快速構建標準配置,也可直接鏈式調用自定義配置。
適用于需要 分步構建復雜對象 且 支持多種配置 的場景(如電腦、汽車、報表生成等)。

六、模式變體與實際應用

1.鏈式調用

通過方法返回this實現鏈式調用(如new Computer.Builder().cpu(“i9”).ram(“32GB”).build()),簡化客戶端代碼。

2.與工廠模式結合

工廠模式關注對象創建,建造者模式關注對象構造過程,兩者可結合使用(如先通過工廠獲取建造者,再調用建造者組裝產品)。

3.JDK中的應用

StringBuilder、StringBuffer均采用建造者模式,通過append()方法逐步構建字符串,最后調用toString()獲取結果。

七、總結

建造者模式適用于構造復雜對象的場景,通過解耦構建過程與產品表示,提升代碼的靈活性和可維護性。其核心優勢在于分步構建和精細控制,但需權衡類數量增加帶來的復雜度。在實際開發中,可根據對象復雜度選擇是否引入指揮者角色,或直接使用鏈式調用的簡化形式。

在這里插入圖片描述

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

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

相關文章

LIA-X - 一張照片生成任意表情肖像動畫視頻 精準操控面部動作 支持50系顯卡 一鍵整合包下載

LIA-X 是一個可解釋的潛在肖像動畫生成器,只需要一張照片加一段驅動視頻生成任意表情肖像動畫, 旨在將驅動視頻中的面部動態精細地轉移到源肖像上,同時提供對頭部、嘴巴和眼睛的精細控制。同時支持圖像和視頻的編輯任務,比如對頭部…

Google 的 Opal:重新定義自動化的 AI 平臺

1. 真實世界測試:結果出乎意料 我讓 Opal 接受了三項極具挑戰性的任務: 1.1. 博客生成器挑戰 我的提示:“研究并撰寫一篇關于 2 億美元融資對無代碼(no-code)影響的文章。” 發生了什么:Opal 不僅僅是寫…

【FreeRTOS】任務通知

任務通知通知狀態的三種取值taskNOT_WAITING_NOTIFICATION:任務沒有在等待通知taskWAITING_NOTIFICATION:任務在等待通知taskNOTIFICATION_RECEIVED:任務接收到了通知,也被稱為 pending(有數據了,待處理)如下面兩個場景…

BEV:隱式相機視角轉換-----BEVFormer

一、背景 基于imp投影的相機視角轉換,對相機的內外參依賴較高,BEV 網格融合固定,可能對小目標不夠敏感;考慮通過transformer的方式進行相機的視角轉換,BEV query 可以自適應關注關鍵區域,提高小目標檢測&am…

zsh 使用筆記 命令行智能提示 bash智能

目錄 安裝: 升級: zsh 有什么用? zsh 安裝: sudo apt update sudo apt install zsh -y 升級: omz update zsh 有什么用? 相比 bash,zsh 更智能、更方便,常見優勢有&#xff…

Laya的適配模式選擇

文章目錄SCALE_FIXED_AUTOSCALE_SHOWALLSCALE_FULLSCALE_FIXED_HEIGHTSCALE_FIXED_WIDTHSCALE_NOSCALESCALE_EXACTFITSCALE_NOBORDERdemoSCALE_FIXED_AUTO NO.1會透,拉伸能解決官網解釋:應用保持設計比例不變,全屏顯示全部內容(類似showall&…

Android中flavor的使用

在我的開發中,有這樣的需求,有一個項目,需要適配不同的執法儀設備,這些執法儀都是Android系統的,而且有的有系統簽名,有的沒有,比如我共有四款型號,有三款有系統簽名,每款…

如何使用DeepSeek解析長pdf的文本

直接使用python工具解析pdf文件,可能因為格式兼容問題,導致解析出的文本幾乎不可讀。 這里嘗試使用Deepseek解析pdf文件,這里僅考慮文本,不考慮其他要素。 1 解析第一步 將pdf作為附件上傳到deepseekchat界面,輸入如…

W3C CSS 活動

W3C CSS 活動 引言 CSS(層疊樣式表)是現代網頁設計中不可或缺的技術之一。W3C(萬維網聯盟)作為全球互聯網標準制定的主要組織,定期舉辦各類CSS相關的活動,旨在促進CSS技術的發展與普及。本文將詳細介紹W3C CSS活動,包括活動內容、參與方式以及活動意義。 活動內容 1…

React Native 與 UniApp 對比

React Native 優點: 由 Facebook 開發維護,社區生態強大 使用 JavaScript/TypeScript 開發,學習曲線相對平緩 真正的原生渲染,性能接近原生應用 支持熱重載,開發效率高 可訪問所有原生平臺 API 大型應用案例豐富(如 Faceboo…

Dijkstra和多層圖 0

眾所周知&#xff0c;Dijkstra經常拿來解決不帶負權和環的單元最短路。我們先來看一下他的實現過程 (由于樸素版用的不多&#xff0c;我們直接上堆優化) 模板 #include<bits/stdc.h> #define mf(x,y) make_pair(x,y)//x距離&#xff0c;y節點 using namespace std; …

【驅動】RK3576:桌面操作系統基本概念

1、桌面操作系統 我們常說的Ubuntu、Debian、麒麟、統信等都是總包工頭; 他們把linux內核、根文件系統(遵循 Linux 標準文件系統層次結構FHS)、包管理(軟件、庫)、桌面環境(GNOME、Xfce等)、初始化系統(Systemd)、各種服務與守護進程、安全組件等整合成一個完整的桌面…

sfc_os!SfcQueueValidationRequest函數分析之sfc_os!IsFileInQueue

第一部分&#xff1a;1: kd> kc# 00 sfc_os!SfcQueueValidationRequest 01 sfc_os!SfcWatchProtectedDirectoriesWorkerThread 02 kernel32!BaseThreadStart1: kd> dvRegVal 0x01129164ChangeType 5vrd 0x012bfef0Status 0n1988337684vrdexisting 0x012bffdc//// if…

100202Title和Input組件_編輯器-react-仿低代碼平臺項目

文章目錄1 開發兩個問卷組件1.1 Title組件1.2 Input組件1.3 畫布靜態展示TItle和Input2 Ajax獲取問卷數據&#xff0c;并存儲到Redux store2.1 API接口2.2 組件列表存儲到Redux store統一管理2.3 重構useLoadQuestionData3 在畫布顯示問卷列表&#xff0c;點擊可選中3.1 Redux獲…

設置計劃任務自動備份mysql

windows系統下1.創建mysql自動備份腳本mysqlback.bat需將此腳本存放在mysql的bin文件夾下。確保此腳本執行成功了在進行第2步做計劃任務。echo off REM 定義備份目錄backup_dir、備份的文件名filename set "backup_dirD:\mysqlback" set "filenamemysqlback_%da…

飛機起落架輪軸深孔中間段電解擴孔內輪廓檢測 - 激光頻率梳 3D 輪廓檢測

摘要&#xff1a;飛機起落架輪軸深孔中間段電解擴孔內輪廓檢測存在精度要求高、結構復雜等挑戰。本文針對電解擴孔特殊工藝特征&#xff0c;探討激光頻率梳 3D 輪廓檢測技術的應用&#xff0c;分析其檢測原理、技術優勢及在輪軸深孔檢測中的實踐&#xff0c;為電解擴孔內輪廓高…

【軟考中級網絡工程師】知識點之入侵防御系統:筑牢網絡安全防線

目錄一、入侵防御系統基礎概念1.1 定義與作用1.2 與其他安全設備的關系二、入侵防御系統工作原理剖析2.1 數據包捕獲與預處理2.2 深度包檢測&#xff08;DPI&#xff09;技術2.3 威脅特征匹配2.4 行為分析與機器學習輔助檢測2.5 威脅處理與響應機制三、入侵防御系統功能全面解析…

Python爬蟲實戰:研究scrapfly-scrapers庫,構建電商/新聞/社交媒體數據采集系統

1. 引言 1.1 研究背景與意義 在大數據與人工智能技術深度滲透各行業的背景下,數據已成為企業決策、學術研究、產品創新的核心驅動力。互聯網作為全球最大的信息載體,蘊含海量結構化與非結構化數據(如電商商品信息、新聞資訊、社交媒體動態等),其價值挖掘依賴高效的數據采…

Python爬蟲反爬檢測失效問題的代理池輪換與請求頭偽裝實戰方案

Python爬蟲反爬檢測失效問題的代理池輪換與請求頭偽裝實戰方案 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是…

【原理】C#構造函數可以標記為Static嗎

【從UnityURP開始探索游戲渲染】專欄-直達 實例構造函數&#xff08;Instance Constructor&#xff09;不能標記為static但C#提供了一種特殊的? 靜態構造函數&#xff08;Static Constructor&#xff09;專門用于初始化靜態成員。下面依次介紹他們&#xff1a; 1. ?實例構造…