類圖+案例+代碼詳解:軟件設計模式----生成器模式(建造者模式)

生成器模式(建造者模式)

把復雜對象的建造過程和表示分離,讓同樣的建造過程可以創建不同的表示。

請添加圖片描述

假設你去快餐店買漢堡,漢堡由面包、肉餅、蔬菜、醬料等部分組成。

建造者模式的角色類比:

  1. 產品(Product):漢堡
    (由多個部分組成的復雜對象)
  2. 抽象建造者(Builder):漢堡建造接口
    (定義 “放面包”“放肉餅”“放蔬菜”“放醬料” 等建造步驟)
  3. 具體建造者(ConcreteBuilder):雞肉堡建造者、牛肉堡建造者
    (分別實現不同漢堡的建造步驟,比如雞肉堡放雞腿肉,牛肉堡放牛肉餅)
  4. 指揮者(Director):服務員
    (告訴建造者 “先放面包→再放肉餅→加蔬菜→加醬料”,控制建造順序)

為什么要用建造者模式?

  • 場景對比:
    • 不用模式時: 直接 new 一個漢堡對象,要一次性傳所有參數(面包類型、肉餅種類、蔬菜數量…),代碼又長又容易錯。
    • 用建造者模式: 像 “組裝樂高” 一樣,一步步造漢堡,每個步驟獨立,最后由指揮者按順序組裝。

核心優勢

  1. 解耦建造過程和產品表示:比如造 “豪華漢堡” 和 “普通漢堡”,可以復用相同的建造流程,只修改部分步驟。
  2. 簡化復雜對象創建:避免 “巨量參數構造函數”,代碼更清晰。
  3. 方便擴展新產品:新增 “素食漢堡” 時,只需新建一個建造者,不修改原有邏輯。

代碼示例

// 1. 產品:漢堡  
class Hamburger {private String bread;private String meat;private String veggies;private String sauce;// 省略getter/setter,用Builder模式時很少直接操作這些字段
}// 2. 抽象建造者:定義建造步驟  
interface HamburgerBuilder {void buildBread();void buildMeat();void buildVeggies();void buildSauce();Hamburger getHamburger();
}// 3. 具體建造者:雞肉堡建造者  
class ChickenBurgerBuilder implements HamburgerBuilder {private Hamburger hamburger = new Hamburger();@Overridepublic void buildBread() { hamburger.setBread("芝麻面包"); }@Overridepublic void buildMeat() { hamburger.setMeat("炸雞腿肉"); }@Overridepublic void buildVeggies() { hamburger.setVeggies("生菜+番茄"); }@Overridepublic void buildSauce() { hamburger.setSauce("番茄醬"); }@Overridepublic Hamburger getHamburger() { return hamburger; }
}// 4. 指揮者:服務員,控制建造順序  
class Waiter {private HamburgerBuilder builder;public Waiter(HamburgerBuilder builder) {this.builder = builder;}// 定義“標準漢堡”的建造流程  public Hamburger buildStandardHamburger() {builder.buildBread();builder.buildMeat();builder.buildVeggies();builder.buildSauce();return builder.getHamburger();}
}// 使用示例  
public class BuilderDemo {public static void main(String[] args) {// 要雞肉堡?找雞肉堡建造者+服務員  HamburgerBuilder chickenBuilder = new ChickenBurgerBuilder();Waiter waiter = new Waiter(chickenBuilder);Hamburger chickenBurger = waiter.buildStandardHamburger();System.out.println("建造了一個:" + chickenBurger.getBread() + " + " + chickenBurger.getMeat() + " + " + chickenBurger.getVeggies() + " + " + chickenBurger.getSauce());}
}
  1. 建造者模式和工廠模式的區別

    • 工廠模式:“一步到位” 創建簡單對象(如直接 new 一個漢堡)。
    • 建造者模式:“分步組裝” 創建復雜對象(如分步驟造漢堡的各個部分)。
  2. 實際場景舉例

    • JDK 中的StringBuilder(一步步 append 字符,最后 toString ())。
    • SQL 語句構建(分步驟拼表名、條件、排序,避免 SQL 注入)。

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

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

相關文章

UI前端與數字孿生融合探索:為智慧物流提供可視化解決方案

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在全球供應鏈數字化轉型的浪潮中,智慧物流正從概念走向落地 —— 據 MarketsandMa…

遠程辦公與協作新趨勢:從遠程桌面、VDI到邊緣計算,打造高效、安全的混合辦公環境

一、引言 隨著數字化轉型的加速,越來越多的企業開始采用遠程辦公和混合辦公模式,以提升員工的靈活性和企業的敏捷性。然而,異地辦公也帶來了諸如桌面環境不一致、安全風險增加、溝通協作效率降低等諸多挑戰。因此,如何打造一致、…

算法總結篇:二叉樹

二叉樹解題整體框架: 1、確定當前題型是做高度還是深度還是搜索樹還是其他 高度(從下往上,求根深度、高度等): 使用后序遍歷會更加簡單,遞歸方法一般需要返回值返回上級,讓上級對返回值進行判斷…

【Elasticsearch】most_fields、best_fields、cross_fields 的區別與用法

most_fields、best_fields、cross_fields 的區別與用法 1.核心區別概述2.詳細解析與用法2.1 best_fields(最佳字段匹配)2.2 most_fields(多字段匹配)2.3 cross_fields(跨字段匹配) 3.對比案例3.1 使用 best…

力扣網C語言編程題:在數組中查找目標值位置之暴力解法

一. 簡介 本文記錄一下力扣網上涉及數組的問題:排序數組中查找目標值的位置。主要以C語言實現。 二. 力扣網C語言編程題:在數組中查找目標值位置 題目:在排序數組中查找元素的第一個和最后一個位置 給你一個按照非遞減順序排列的整數數組 …

OSCP - Proving Grounds - tre

主要知識點 突破邊界的方法比較多樣觀察pspy64的檢測結果 具體步驟 依舊nmap掃描開始,開放了80,8082,22端口 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-16 03:39 UTC Nmap scan report for 192.168.56.84 Host is up (0.00083s latency). Not shown: 65532 c…

【Mars3d】支持的basemaps數組與layers數組的坐標系列舉

問題場景: basemap 是epsg4326的。,layer 圖層是 epsg 4450的。可以在一個頁面中展示嗎? 回復: 可以不同坐標系疊加,但layer 圖層是 epsg 4450的只支持arcgis動態服務,其他情況的不支持 wmts只支持3個坐標…

【算法】509. 斐波那契數

509. 斐波那契數 簡單 相關標簽 premium lock icon 相關企業 斐波那契數 (通常用 F(n) 表示)形成的序列稱為 斐波那契數列 。該數列由 0 和 1 開始,后面的每一項數字都是前面兩項數字的和。也就是: F(0) 0,F(1) 1 …

FOC學習筆記(5)內嵌式電機與表貼式電機的區別

1. 引言 在現代電機設計中,永磁同步電機(Permanent Magnet Synchronous Motor, PMSM)因其高效率、高功率密度和優異的動態性能,在工業、新能源汽車、航空航天等領域得到廣泛應用。根據永磁體在轉子中的安裝方式不同,永…

算法 按位運算

按位與(Bitwise AND)和按位異或(Bitwise XOR) 按位與(&) 按位與是對兩個數的二進制表示的每一位進行邏輯與操作。 規則:兩個對應位都為1時,結果位才為1,否則為0。…

python3GUI--基于PyQt5+SQLite3的網址審核系統(詳細圖文)

文章目錄 一.前言二.相關知識1.PyQt52.sqlite3 三.效果預覽1.登錄2.注冊3.普通用戶身份權限4.管理員身份權限 三、技術討論1.數據展示表格1. 更強的表現力和交互性(前端功能豐富)2. 數據處理效率更高(支持大…

與后端現場聯調mock數據

當我們后端在現場沒辦法連后端本地就可以使用mock數據,模擬后端返回數據。使用工具:apifox 一、安裝好以后--新建接口 舉個栗子: 我想建個接口http://123.123.123.123:8080/api/login 二、 新建期望,返回固定值,否則…

C# 事件(發布者和訂閱者)

發布者和訂閱者 很多程序都有一個共同的需求,即當一個特定的程序事件發生時,程序的其他部分可以得到 該事件已經發生的通知。 發布者/訂閱者模式(publisher/subscriber pattem)可以滿足這種需求。在這種模式中,發布 …

RediSearch高性能全文搜索引擎

RediSearch 是 RedisLabs 團隊開發的一個高性能全文搜索引擎,可作為一個 Redis Module 運行在 Redis 上。 Redis7:百萬數據級Redis Search 超越 ElasticSearch Redis Search是基于Redis的全文搜索引擎模塊(RediSearch)&#xff0c…

菜譜大全——字符串處理藝術:從文本解析到高效搜索 [特殊字符][特殊字符]

目錄 前言一、現實場景二、技術映射2.1 基礎刀工:String類2.2 高效剁餡:StringBuilder2.3 精準雕刻:正則表達式 三、知識點呈現3.1 String vs StringBuilder vs StringBuffer3.2 正則表達式核心語法速查3.3 字符串拼接性能陷阱 四、代碼實現五…

webpack+vite前端構建工具 -答疑

webpack答疑 1 輸入webpack命令,執行的是全局版本還是本地版本的webpack 當在命令行窗口輸入webpack命令時,其執行優先級可通過以下步驟明確判斷: 1.1 【全局安裝優先機制】 執行原理:系統會按照環境變量PATH的順序逐級查找可執…

API接口開放平臺 Crabc 3.4 發布

Crabc 是一款 API 接口開發平臺,企業級接口管理、SQL2API 平臺。支持動態數據源、動態 SQL 和標簽, 支持接入(mysql、oracle、達夢、TiDB、hive、es 和 mongodb)等 SQL 或 NoSQL 數據源,在線可視化編寫 SQL 快速發布接…

PD快充協議芯片XSP04D支持全協議+支持串口通訊+支持與主板共用一個Type-C

隨著Type-C接口的充電器普及,市面上的PD充電器越來越多,小家電產品可不配充電器,使用Type-C接口,然后加入一顆PD協議取電協議芯片XSP08即可讓充電器/充電寶/車充等電源輸出9V/12V/15V/20V電壓給產品供電。 針對各種各樣的不同需求…

C# 高效加載txt文件內容

在 C# 中,高效加載 TXT 文件內容可以通過多種方法實現,具體方法的選擇取決于文件的大小和讀取需求。以下是一些常用的方法: 1. 使用 File.ReadAllText 如果文件比較小,并且你希望一行一行地讀取整個內容,可以使用 Fi…

(2)pytest執行用例的規則

1. 簡介 今天主要學習一下pytest的執行用例的規則。 2. 通過help幫助查看pytest如何使用 .查看pytest命令行參數,可以用pytest -h 或pytest --help查看 3. 用例設計原則 文件名以test_*.py文件和*_test.py以test_開頭的函數以Test開頭的類以test_開頭的方法所有的…