設計模式精講 Day 4:建造者模式(Builder Pattern)

【設計模式精講 Day 4】建造者模式(Builder Pattern)


文章簡述:

在軟件開發中,對象的構造過程往往復雜且容易出錯,尤其是在對象包含多個可選參數或構建步驟時。建造者模式(Builder Pattern)正是為了解決這一問題而誕生的一種創建型設計模式。本文作為“設計模式精講”系列的第4天,系統講解了建造者模式的核心思想、結構組成、適用場景和實現方式。文章通過真實項目案例分析,展示了如何利用建造者模式提升代碼的可讀性、靈活性與可維護性。同時,結合Java標準庫和主流框架中的應用實例,深入解析了該模式在實際開發中的價值。文末還對比了建造者模式與其他創建型模式的區別,并給出了最佳實踐建議。


一、模式定義:建造者模式的核心思想

建造者模式是一種創建型設計模式,它將一個復雜對象的構建過程與其表示分離,使得同樣的構建過程可以創建不同的表示。

換句話說,建造者模式允許你逐步構建一個復雜的對象,而不是一次性使用大量參數調用構造函數。它通過一系列方法逐步設置對象的各個屬性,最終返回完整的對象。

核心思想

  • 解耦構建邏輯與對象表示
  • 支持不同風格的對象構造
  • 避免構造函數爆炸(overloading)

二、模式結構:UML類圖與關鍵角色說明

雖然我們無法插入圖片,但以下文字描述了建造者模式的典型UML結構:

  1. Builder(抽象建造者)
    定義創建產品各個部件的抽象方法,如 buildPartA()buildPartB() 等。

  2. ConcreteBuilder(具體建造者)
    實現 Builder 接口,負責構建并裝配產品部件,最終返回完整的產品對象。

  3. Product(產品)
    被構建的復雜對象,由多個部件組成。

  4. Director(指揮者)
    不直接與客戶端交互,而是指導建造者按照特定順序構建產品,通常不暴露具體的構建細節。


三、適用場景:何時使用建造者模式?

建造者模式適用于以下幾種情況:

場景描述
對象構造復雜對象有多個可選參數或構建步驟
構造過程需要靈活控制需要根據配置或條件變化來構建不同版本的對象
避免構造函數爆炸防止因參數過多導致構造函數重載過多
提高可讀性和可維護性使對象構造過程更清晰、模塊化

例如:

  • 構建一個復雜的 Computer 對象,包含 CPU、內存、硬盤等組件。
  • 構建一個 Meal(套餐),包含主菜、飲料、甜點等部分。
  • 構建一個 Report(報告),包含標題、正文、圖表等內容。

四、實現方式:完整的Java代碼示例

以下是一個典型的建造者模式實現示例,用于構建一個 Computer 對象。

4.1 抽象建造者(Builder)

/*** 抽象建造者:定義構建計算機的各個步驟*/
public interface ComputerBuilder {void buildCPU();void buildMemory();void buildStorage();void buildGraphicsCard();Computer getComputer();
}

4.2 具體建造者(ConcreteBuilder)

/*** 具體建造者:構建高性能計算機*/
public class HighPerformanceComputerBuilder implements ComputerBuilder {private Computer computer;public HighPerformanceComputerBuilder() {this.computer = new Computer();}@Overridepublic void buildCPU() {computer.setCPU("Intel i9");}@Overridepublic void buildMemory() {computer.setMemory("64GB DDR4");}@Overridepublic void buildStorage() {computer.setStorage("2TB NVMe SSD");}@Overridepublic void buildGraphicsCard() {computer.setGraphicsCard("NVIDIA RTX 4090");}@Overridepublic Computer getComputer() {return computer;}
}

4.3 產品類(Product)

/*** 產品:表示計算機對象*/
public class Computer {private String cpu;private String memory;private String storage;private String graphicsCard;// Getter 和 Setter 方法public String getCpu() { return cpu; }public void setCpu(String cpu) { this.cpu = cpu; }public String getMemory() { return memory; }public void setMemory(String memory) { this.memory = memory; }public String getStorage() { return storage; }public void setStorage(String storage) { this.storage = storage; }public String getGraphicsCard() { return graphicsCard; }public void setGraphicsCard(String graphicsCard) { this.graphicsCard = graphicsCard; }@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", storage='" + storage + '\'' +", graphicsCard='" + graphicsCard + '\'' +'}';}
}

4.4 指揮者(Director)

/*** 指揮者:指導建造者按順序構建計算機*/
public class ComputerDirector {private ComputerBuilder builder;public ComputerDirector(ComputerBuilder builder) {this.builder = builder;}public Computer constructComputer() {builder.buildCPU();builder.buildMemory();builder.buildStorage();builder.buildGraphicsCard();return builder.getComputer();}
}

4.5 使用示例

public class Client {public static void main(String[] args) {ComputerBuilder builder = new HighPerformanceComputerBuilder();ComputerDirector director = new ComputerDirector(builder);Computer computer = director.constructComputer();System.out.println(computer);}
}

輸出結果

Computer{cpu='Intel i9', memory='64GB DDR4', storage='2TB NVMe SSD', graphicsCard='NVIDIA RTX 4090'}

五、工作原理:建造者模式如何解決問題?

建造者模式通過將對象的構建過程分解為多個獨立的步驟,實現了以下目標:

  • 解耦構建邏輯與對象表示:客戶端無需知道內部構造細節,只需提供建造者接口即可。
  • 支持靈活的構建流程:可以通過不同的建造者實現不同的產品變體。
  • 避免構造函數爆炸:減少構造函數的參數數量,提高可讀性和可維護性。

例如,在構建 Computer 對象時,如果采用傳統構造函數的方式,可能會出現如下問題:

Computer c = new Computer("Intel i9", "64GB DDR4", "2TB NVMe SSD", "NVIDIA RTX 4090");

隨著參數增加,構造函數會變得難以管理。而使用建造者模式后,構建過程更加清晰、可控。


六、優缺點分析:建造者模式的利與弊

優點缺點
解耦構建邏輯與對象表示增加了系統的復雜度
支持不同風格的對象構造如果產品結構變化頻繁,建造者可能需要頻繁修改
避免構造函數爆炸適合對象構造步驟固定且復雜的情況
提高可讀性和可維護性不適合簡單對象的構造

七、案例分析:電商平臺商品詳情頁構建

7.1 問題背景

某電商平臺的商品詳情頁需要展示多種類型的商品信息,包括普通商品、促銷商品、預售商品等。每種商品的信息結構略有差異,但整體構建邏輯相似。

7.2 問題分析

  • 商品信息包含多個字段,如名稱、價格、庫存、圖片、描述等。
  • 不同類型的商品需要不同的構建邏輯(如促銷商品需要額外添加折扣信息)。
  • 直接使用構造函數或工廠方法會導致代碼重復和難以維護。

7.3 解決方案

引入建造者模式,定義通用的 ProductBuilder 接口,然后為每種商品類型實現具體的建造者。

示例代碼(簡化版):
interface ProductBuilder {void buildName();void buildPrice();void buildStock();void buildDescription();Product build();
}class NormalProductBuilder implements ProductBuilder {private Product product = new Product();@Overridepublic void buildName() { product.setName("普通商品"); }@Overridepublic void buildPrice() { product.setPrice(100); }@Overridepublic void buildStock() { product.setStock(100); }@Overridepublic void buildDescription() { product.setDescription("這是一個普通商品"); }@Overridepublic Product build() { return product; }
}class PromotionProductBuilder implements ProductBuilder {private Product product = new Product();@Overridepublic void buildName() { product.setName("促銷商品"); }@Overridepublic void buildPrice() { product.setPrice(80); }@Overridepublic void buildStock() { product.setStock(50); }@Overridepublic void buildDescription() { product.setDescription("這是一個促銷商品,享受8折優惠"); }@Overridepublic Product build() { return product; }
}

7.4 效果對比

方案可維護性擴展性可讀性
直接構造
工廠方法一般一般一般
建造者模式優秀優秀優秀

八、與其他模式的關系:建造者模式 vs 工廠模式 vs 抽象工廠模式

模式核心目的適用場景與建造者模式的對比
工廠模式創建單一對象當對象種類較少,且不需要復雜構建流程工廠模式側重于“創建”,建造者模式側重于“構建”
抽象工廠模式創建一組相關對象當需要創建多個相關對象時抽象工廠關注對象族,建造者關注對象構建步驟
建造者模式構建復雜對象當對象構建過程復雜,需分步完成更強調構建過程的靈活性和可擴展性

九、總結與預告

本篇文章詳細介紹了建造者模式的核心思想、結構組成、適用場景以及實現方式,并通過真實項目案例展示了其在實際開發中的應用價值。建造者模式通過解耦構建邏輯與對象表示,提升了代碼的可讀性、可維護性和靈活性。

核心技能總結:

  • 掌握建造者模式的定義、結構和應用場景。
  • 能夠識別哪些場景適合使用建造者模式。
  • 能夠使用 Java 實現建造者模式,構建復雜對象。
  • 理解建造者模式與其他創建型模式的區別與聯系。

下一篇預告:

Day 5: 原型模式(Prototype Pattern)

我們將深入探討原型模式的設計思想,學習如何通過復制現有對象來創建新對象,從而提高性能并簡化對象創建過程。歡迎繼續關注本系列文章!


文章標簽:

design-patterns, java, builder-pattern, software-design, object-oriented-programming


進一步學習參考資料:

  1. 《設計模式:可復用面向對象軟件的基礎》 - GoF
  2. Java Design Patterns - Oracle 官方文檔
  3. 《Effective Java》 - Joshua Bloch
  4. Builder Pattern in Java - GeeksforGeeks
  5. Java Design Patterns: Builder - Baeldung

如需獲取完整代碼示例與測試腳本,請關注本系列文章后續更新。歡迎在CSDN評論區交流您的使用經驗與優化思路。

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

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

相關文章

如何輕松地將聯系人從 iPhone 轉移到 iPhone?

也許您升級到最新的 iPhone 型號,或者需要切換到另一部 iPhone 來工作。無論如何,您不能錯過您的聯系人,這對每個人來說都是最重要的數據。因此,今天我們將分享 5 種如何將聯系人從 iPhone 轉移到 iPhone 的方法,幫助您…

【51單片機簡單的流水燈程序問題】2022-5-24

1.利用單片機的P2口接8個發光二極管。簡單的流水燈程序問題-編程語言-CSDN問答 2.發光二極管自由閃爍(自己設計兩種模式)。 3.可通過按鍵實現暫停、啟動以及不用模式的切換。 4. 利用Proteus繪制電路原理圖 5. 元件選型&#xff1…

第七節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 用戶管理(上)

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 對接后端登錄接口(上) ? 第四節:Vben Ad…

1572. 矩陣對角線元素的和

給你一個正方形矩陣 mat,請你返回矩陣對角線元素的和。 請你返回在矩陣主對角線上的元素和副對角線上且不在主對角線上元素的和。 示例 1: 輸入:mat [[1,2,3],[4,5,6],[7,8,9]] 輸出:25 解釋:對角線的和為&#xf…

供應鏈場景使用ClickHouse最佳實踐

一、概述 ClickHouse是一款由俄羅斯公司Yandex開發的開源列式數據庫管理系統,以其高性能的分析查詢能力和高壓縮比著稱。供應鏈場景中,數據量大且數據類型復雜,需要高效的數據存儲和快速的查詢性能,ClickHouse在這些方面具有顯著…

RA4M2開發IOT(0)----安裝e2 studio

RA4M2開發IOT.0--安裝e studio 概述視頻教學樣品申請安裝 概述 瑞薩電子靈活配置軟件包 (FSP) 是用于嵌入式系統設計的高質量增強型軟件包,支持瑞薩電子 RA 產品家族 Arm 微控制器,提供用戶友好的界面且可靈活擴展,確保從入門級到高性能的整…

【Ambari3.0.0 部署】Step2—免密登陸認證-適用于el8

如果有其他系統部署需求可以參考原文 戳我->所有組件編譯教程 戳我->獲取部署源代碼 一、免密登錄認證 🔐 在多臺服務器協同工作的環境中,免密登錄(SSH 免密認證)是一種常見的優化手段,能夠極大地提升運維效率&…

網站自助廣告投放系統源碼 附安裝教程(源碼下載)

網站自助廣告投放系統源碼 全自動無人化出售網站廣告位 站長必備 源碼測試可用,部分加密。感興趣自行下載 源碼下載:https://download.csdn.net/download/m0_66047725/91093092 更多資源下載:關注我 圖片:

日常運維問題匯總-15

42.SD開票計劃產生的預收款在正式開票時未自動清賬 統馭科目(應收、預收)對應的字段狀態組中附加科目設置銷售訂單字段設置為了隱藏導致,更改為“可選輸入項” 43.MIGO取消憑證時,用戶反饋發現除一行外,其它都不能取消…

【設計模式】6.原型模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 原型模式 1. 基礎 import copyclass Resume:def __init__(self, name):self.name nameself.sex Noneself.age Noneself.time_area Noneself.compan…

【算法 day08】LeetCode 151.翻轉字符串里的單詞 |卡碼網:55.右旋轉字符串

151.翻轉字符串里的單詞 題目鏈接 | 文檔講解 |視頻講解 : 鏈接 1.思路: 1.去除字符串頭尾的空格 ,使用庫函數 trim() 2.對字符串進行分割,使用庫函數split() 3.創建StringBuilder sb&#x…

【WordPress優化插件】WPOPT v2.4.7

WPOPT插件,是由本站開發的一款WordPress優化插件,能對WordPress底層功能進行優化,支持功能開關,系統加速等功能。 2.0版本全新發布,采用vite打包,界面采用Vue3+element-plus制作。無論是外觀,還是框架功能,都是空前的強大。 功能更多,更強,是所有WordPress網站都值得…

如何使用 mkimage 工具生成 uImage 文件(RISC-V 環境)

一、mkimage 命令參數詳解 在 RISC-V Linux 環境下,使用 U-Boot 的 mkimage 工具生成 uImage 的基本命令格式如下: mkimage -A riscv -O linux -T kernel -C compression -a load_addr -e entry_addr -n "描述信息" -d Image uImage核心參數…

React Native 搭建iOS與Android開發環境

目錄 第一步 第二步 一、必須安裝的工具 二、具體安裝步驟 1. 安裝 Homebrew 切換國內源和其他配置: 2. 安裝 node 3.下載watchman 4. Ruby 5.CocoaPods 配置環境 6. jdk 7. 配置git 開發環境 第三步——啟動項目(可以忽略) 1…

Vue 簡寫形式全解析:清晰記憶指南

Vue 簡寫形式全解析:清晰記憶指南 Vue 中的各種簡寫形式確實容易混淆,我將它們系統化整理,并提供了多種記憶方法,幫助你輕松掌握! 一、核心簡寫形式匯總表 完整形式簡寫形式適用場景記憶技巧v-bind:attribute:attribute動態綁定屬性: 像鏈條,表示"綁定"v-on:…

車載電子電器架構 --- 電子電氣架構設計方案

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

MVCC中read_view的核心參數解析與讀操作流程實戰

在數據庫并發控制領域,MVCC(多版本并發控制)是實現高性能讀寫并發的關鍵技術。其中,read_view作為MVCC判斷數據可見性的核心組件,其內部參數的設計直接影響著并發訪問的行為。本文將深入解析read_view的三個核心參數&a…

從代碼學習深度強化學習 - REINFORCE 算法 PyTorch版

文章目錄 前言**一、 理論基礎:什么是策略梯度?****1.1 基于價值 vs. 基于策略****1.2 策略梯度(Policy Gradient)****1.3 REINFORCE 算法:蒙特卡洛策略梯度****1.4 REINFORCE 算法流程****二、 PyTorch 代碼實踐****2.1 環境與輔助函數****2.2 核心算法實現****2.3 訓練與…

CRMEB 代碼規范指南:ThinkPHP6+Uni-app 架構下的開發標準

二、代碼規范 2.1 Vue .1.1 代碼結構 <template><div id"my-component"><DemoComponent /></div> </template><script> import DemoComponent from ../components/DemoComponentexport default {name: MyComponent,component…

游戲技能編輯器開發完全指南系統架構設計之技能編輯器整體架構

技能編輯器整體架構 角色資源劃分與管理 1. 角色資源結構 角色資源劃分與管理 1. 角色資源結構 // 骨骼重定向示例 void RetargetAnimation(Animation& srcAnim, Skeleton& targetSkeleton) {for (int frame 0; frame < srcAnim.numFrames; frame) {for (Bone&a…