Java編程之建造者模式

建造者模式(Builder Pattern)是一種創建型設計模式,它將一個復雜對象的構建與表示分離,使得同樣的構建過程可以創建不同的表示。這種模式允許你分步驟構建一個復雜對象,并且可以在構建過程中進行不同的配置。

模式的核心組件

建造者模式通常包含以下四個核心組件:

  1. 產品(Product):要構建的復雜對象。
  2. 抽象建造者(Builder):定義了構建產品各個部分的抽象接口。
  3. 具體建造者(Concrete Builder):實現抽象建造者接口,完成產品各部分的具體構建。
  4. 指揮者(Director):負責安排復雜對象的構建順序,并使用建造者對象構建產品。

簡單實現

讓我們通過一個示例來詳細說明建造者模式的實現。假設我們要構建一個電腦(Computer)對象,它包含 CPU、內存、硬盤和顯卡等組件。

首先,定義產品類:

// 產品類:電腦
public class Computer {private String cpu;private String memory;private String hardDisk;private String graphicsCard;// 私有構造函數,只能通過Builder創建Computerprivate Computer(Builder builder) {this.cpu = builder.cpu;this.memory = builder.memory;this.hardDisk = builder.hardDisk;this.graphicsCard = builder.graphicsCard;}// Getter方法public String getCpu() {return cpu;}public String getMemory() {return memory;}public String getHardDisk() {return hardDisk;}public String getGraphicsCard() {return graphicsCard;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", hardDisk='" + hardDisk + '\'' +", graphicsCard='" + graphicsCard + '\'' +'}';}// 靜態內部類:Builderpublic static class Builder {private String cpu;private String memory;private String hardDisk;private String graphicsCard;// 設置CPU,返回Builder實例以便鏈式調用public Builder setCpu(String cpu) {this.cpu = cpu;return this;}// 設置內存,返回Builder實例以便鏈式調用public Builder setMemory(String memory) {this.memory = memory;return this;}// 設置硬盤,返回Builder實例以便鏈式調用public Builder setHardDisk(String hardDisk) {this.hardDisk = hardDisk;return this;}// 設置顯卡,返回Builder實例以便鏈式調用public Builder setGraphicsCard(String graphicsCard) {this.graphicsCard = graphicsCard;return this;}// 構建Computer對象public Computer build() {// 可以在這里添加參數驗證邏輯if (cpu == null || memory == null || hardDisk == null) {throw new IllegalArgumentException("CPU、內存和硬盤是必需的");}return new Computer(this);}}
}

然后,使用建造者模式創建電腦對象:

public class BuilderPatternExample {public static void main(String[] args) {// 使用Builder創建電腦對象Computer gamingComputer = new Computer.Builder().setCpu("Intel i9-12900K").setMemory("32GB DDR5").setHardDisk("2TB NVMe SSD").setGraphicsCard("NVIDIA RTX 3080").build();Computer officeComputer = new Computer.Builder().setCpu("Intel i5-12400").setMemory("16GB DDR4").setHardDisk("512GB SSD").build(); // 辦公電腦可以不設置獨立顯卡System.out.println("游戲電腦配置:" + gamingComputer);System.out.println("辦公電腦配置:" + officeComputer);}
}

如上是一個建造者模式的簡單實現,是不是感覺超級簡單,下面是經典的實現方式

?經典實現

// 1. 產品類:電腦
public class Computer {private String cpu;private String memory;private String hardDisk;private String graphicsCard;// 構造函數和Getter方法public Computer(String cpu, String memory, String hardDisk, String graphicsCard) {this.cpu = cpu;this.memory = memory;this.hardDisk = hardDisk;this.graphicsCard = graphicsCard;}@Overridepublic String toString() {return "Computer{" +"cpu='" + cpu + '\'' +", memory='" + memory + '\'' +", hardDisk='" + hardDisk + '\'' +", graphicsCard='" + graphicsCard + '\'' +'}';}
}// 2. 抽象建造者接口
public interface ComputerBuilder {void buildCPU();void buildMemory();void buildHardDisk();void buildGraphicsCard();Computer getComputer();
}// 3. 具體建造者:游戲電腦建造者
public class GamingComputerBuilder implements ComputerBuilder {private Computer computer;public GamingComputerBuilder() {this.computer = new Computer(null, null, null, null);}@Overridepublic void buildCPU() {computer.setCpu("Intel i9-12900K");}@Overridepublic void buildMemory() {computer.setMemory("32GB DDR5");}@Overridepublic void buildHardDisk() {computer.setHardDisk("2TB NVMe SSD");}@Overridepublic void buildGraphicsCard() {computer.setGraphicsCard("NVIDIA RTX 3080");}@Overridepublic Computer getComputer() {return computer;}
}// 3. 具體建造者:辦公電腦建造者
public class OfficeComputerBuilder implements ComputerBuilder {private Computer computer;public OfficeComputerBuilder() {this.computer = new Computer(null, null, null, null);}@Overridepublic void buildCPU() {computer.setCpu("Intel i5-12400");}@Overridepublic void buildMemory() {computer.setMemory("16GB DDR4");}@Overridepublic void buildHardDisk() {computer.setHardDisk("512GB SSD");}@Overridepublic void buildGraphicsCard() {// 辦公電腦可以不設置獨立顯卡}@Overridepublic Computer getComputer() {return computer;}
}// 4. 指揮者:控制構建過程
public class ComputerDirector {private ComputerBuilder builder;public ComputerDirector(ComputerBuilder builder) {this.builder = builder;}public void constructComputer() {builder.buildCPU();builder.buildMemory();builder.buildHardDisk();builder.buildGraphicsCard();}public Computer getComputer() {return builder.getComputer();}
}// 客戶端代碼
public class Client {public static void main(String[] args) {// 構建游戲電腦ComputerBuilder gamingBuilder = new GamingComputerBuilder();ComputerDirector director = new ComputerDirector(gamingBuilder);director.constructComputer();Computer gamingComputer = director.getComputer();// 構建辦公電腦ComputerBuilder officeBuilder = new OfficeComputerBuilder();director = new ComputerDirector(officeBuilder);director.constructComputer();Computer officeComputer = director.getComputer();System.out.println("游戲電腦配置:" + gamingComputer);System.out.println("辦公電腦配置:" + officeComputer);}
}

模式的優點

  1. 分離構建和表示:使得構建算法可以獨立于產品的表示,提高了系統的可擴展性。
  2. 分步構建:可以分步驟構建一個復雜對象,允許在構建過程中進行不同的配置。
  3. 鏈式調用:通過鏈式調用方法設置屬性,使代碼更簡潔易讀。
  4. 參數驗證:可以在build()方法中添加參數驗證邏輯,確保對象的完整性。

模式的應用場景

  1. 復雜對象構建:當創建一個對象需要很多步驟,并且這些步驟的順序可能不同。
  2. 可選參數較多:當一個類的構造函數有很多參數,特別是其中很多是可選參數時。
  3. 構建不同表示:當需要創建同一個產品的不同表示時。

與其他模式的比較

  • 工廠模式:工廠模式關注的是整體對象的創建,而建造者模式關注的是對象的分步構建。
  • 抽象工廠模式:抽象工廠模式返回的是一系列相關產品,而建造者模式返回的是一個完整的產品。

建造者模式在實際開發中非常常用,特別是在創建復雜對象時。它能夠使代碼更加清晰、靈活,并且易于維護。另外Lombok 的@Builder注解是一個強大的工具,它能自動生成流式 API 風格的 "建造者模式 (Builder Pattern)" 代碼,從而避免編寫大量樣板代碼。使用該注解可以讓代碼更簡潔,同時保持建造者模式的優勢。

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

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

相關文章

Spring AI之RAG入門

目錄 1. 什么是RAG 2. RAG典型應用場景 3. RAG核心流程 3.1. 檢索階段 3.2. 生成階段 4. 使用Spring AI實現RAG 4.1. 創建項目 4.2. 配置application.yml 4.3. 安裝ElasticSearch和Kibana 4.3.1. 安裝并啟動ElasticSearch 4.3.2. 驗證ElasticSearch是否啟動成功 …

mysql數據庫實現分庫分表,讀寫分離中間件sharding-sphere

一 概述 1.1 sharding-sphere 作用: 定位關系型數據庫的中間件,合理在分布式環境下使用關系型數據庫操作,目前有三個產品 1.sharding-jdbc,sharding-proxy 1.2 sharding-proxy實現讀寫分離的api版本 4.x版本 5.x版本 1.3 說明…

運維視角下的廣告系統之理解廣告索引級聯

廣告索引中為什么要級聯 這里的“級聯”一般指的是多層索引結構,也叫級聯索引(Cascade Index 或 Multi-level Index)。 在廣告系統的索引中,級聯設計有重要作用,主要原因如下: 1. 多維特征篩選的需求 廣…

2025年5月24日系統架構設計師考試題目回顧

當前僅僅是個人用于記錄&#xff0c;還未做詳細分析&#xff0c;待更新… 綜合知識 設 x,y 滿足約束條件&#xff1a;x-1>0, x-y<0, x-y-x<0, 則 y/x 的最大值是()。 A. 3 B. 2 C. 4 D. 1 申請軟件著作權登記時應當向中國版本保護中心提交軟件的鑒別材料&#xff…

3D-激光SLAM筆記

目錄 定位方案 編譯tbb ros2humble安裝 命令 colcon commond not found 柵格地圖生成&#xff1a; evo畫軌跡曲線 安裝gtsam4.0.2 安裝ceres-solver1.14.0 定位方案 1 方案一&#xff1a;改動最多 fasterlio 建圖&#xff0c;加閉環優化&#xff0c;參考fast-lio增加關…

貪心算法應用:分數背包問題詳解

貪心算法與分數背包問題 貪心算法&#xff08;Greedy Algorithm&#xff09;是算法設計中一種重要的思想&#xff0c;它在許多經典問題中展現出獨特的優勢。本文將用2萬字篇幅&#xff0c;深入剖析貪心算法在分數背包問題中的應用&#xff0c;從基礎原理到Java實現細節&#x…

PyTorch——非線性激活(5)

非線性激活函數的作用是讓神經網絡能夠理解更復雜的模式和規律。如果沒有非線性激活函數&#xff0c;神經網絡就只能進行簡單的加法和乘法運算&#xff0c;沒法處理復雜的問題。 非線性變化的目的就是給我們的網絡當中引入一些非線性特征 Relu 激活函數 Relu處理圖像 # 導入必…

iOS 電子書聽書功能的實現

在 iOS 應用中實現電子書聽書&#xff08;文本轉語音&#xff09;功能&#xff0c;可以通過系統提供的 AVFoundation 框架實現。以下是詳細實現步驟和代碼示例&#xff1a; 核心步驟&#xff1a; 導入框架創建語音合成器配置語音參數實現播放控制處理后臺播放添加進度跟蹤 完整…

ES中must與filter的區別

在 Elasticsearch 的布爾查詢&#xff08;bool query&#xff09;中&#xff0c;must 和 filter 是兩個核心子句&#xff0c;它們的核心區別在于 是否影響相關性評分&#xff0c;這直接決定了它們在查詢性能、使用場景和結果排序上的差異。以下是詳細對比&#xff1a; 一、核心…

vscode實時預覽編輯markdown

vscode實時預覽編輯markdown 點擊vsode界面&#xff0c;實現快捷鍵如下&#xff1a; 按下快捷鍵 CtrlShiftV&#xff08;Windows/Linux&#xff09;或 CommandShiftV&#xff08;Mac&#xff09;即可在側邊欄打開 Markdown 預覽。 效果如下&#xff1a;

Android第十一次面試flutter篇

Flutter基礎? 在 Flutter 中&#xff0c;?三棵樹&#xff08;Widget Tree、Element Tree、RenderObject Tree&#xff09;?? 是框架的核心設計&#xff0c;它們協同工作以實現高效的 UI 渲染和更新機制。 ?1. Widget Tree&#xff08;Widget 樹&#xff09;?? ?是什么…

多線程編程中的數據競爭與內存可見性問題解析

引言 在多線程編程中&#xff0c;看似簡單的代碼往往隱藏著復雜的并發問題。今天我們來分析一個經典的生產者-消費者場景&#xff0c;看看在多核CPU環境下可能出現的各種"意外"情況。 問題代碼分析 讓我們先看看這段看似正常的C#代碼&#xff1a; using System; u…

Linux 與 Windows:哪個操作系統適合你?

Linux vs Windows:系統選擇的關鍵考量 在數字化轉型浪潮中,操作系統作為底層基礎設施的重要性日益凸顯。Linux與Windows作為主流選擇,其差異不僅體現在技術架構上,更深刻影響著開發效率、運維成本與安全性。本文將從??7個核心維度??展開對比分析,并提供典型應用場景建…

佰力博科技與您探討低溫介電溫譜測試儀的應用領域

低溫介電溫譜測試應用領域有如下&#xff1a; 一、電子材料&#xff1a; 低溫介電溫譜測試儀廣泛應用于電子材料的性能測試&#xff0c;如陶瓷材料、半導體材料、壓電材料等。通過該設備&#xff0c;可以評估材料在高溫或低溫環境下的介電性能&#xff0c;為材料的優化和應用提…

Windows 下徹底刪除 VsCode

徹底刪除 VS Code (Visual Studio Code) 意味著不僅要卸載應用程序本身&#xff0c;還要刪除所有相關的配置文件、用戶數據、插件和緩存。這可以確保你有一個完全干凈的狀態&#xff0c;方便你重新安裝或只是徹底移除它。 重要提示&#xff1a; 在執行以下操作之前&#xff0c…

STM32與GD32標準外設庫深度對比

近年來,隨著全球芯片短缺和市場價格波動,工程師們開始尋求對常用MCU的替代方案。在STM32因產能受限而頻頻漲價的背景下,GD32作為國產替代的重要選項,獲得了越來越多的關注。尤其是GD32F103系列,由于其在硬件封裝、功能特性乃至軟件支持上的“高相似度”,成為STM32F103的熱…

使用Redis的四個常見問題及其解決方案

Redis 緩存穿透 定義&#xff1a;redis查詢一個不存在的數據&#xff0c;導致每次都查詢數據庫 解決方案&#xff1a; 如果查詢的數據為空&#xff0c;在redis對應的key緩存空數據&#xff0c;并設置短TTL。 因為緩存穿透通常是因為被惡意用不存在的查詢參數進行壓測攻擊&…

Java高級 | 【實驗一】Spring Boot安裝及測試 最新

隸屬文章&#xff1a;Java高級 | &#xff08;二十二&#xff09;Java常用類庫-CSDN博客 目錄 一、SpringBoot的特點 二、Spring Boot安裝及測試 &#xff08;一&#xff09;安裝Intellij IDEA &#xff08;二&#xff09;安裝MySQL &#xff08;三&#xff09;安裝postma…

Oracle RMAN自動恢復測試腳本

說明 此恢復測試腳本&#xff0c;基于rman備份腳本文章使用的fullbak.sh做的備份。 數據庫將被恢復到RESTORE_LO參數設置的位置。 在恢復完成后&#xff0c;執行一個測試sql,確認數據庫恢復完成&#xff0c;數據庫備份是好的。恢復測試數據庫的參數&#xff0c;比如SGA大小都…

從Java的JDK源碼中學設計模式之裝飾器模式

裝飾器模式是一種極具彈性的結構型設計模式&#xff0c;它允許我們通過組合的方式動態擴展對象功能而無需修改原有結構。本文將通過JDK源碼中的實際應用和通俗易懂的代碼示例&#xff0c;帶你深入了解這一強大模式的精髓。 裝飾器模式核心原理 裝飾器模式的核心思想&#xff…