Java設計模式之創建型—建造者模式

Java中最常用的設計模式-CSDN博客

“把對象的構造步驟拆成鏈式方法,調用者按需填參,最后一次性 build,避免構造函數爆炸。”

  1. 經典場景

  • 參數多(>4 個)且大部分可選

  • 需要不可變對象(final 字段)

  • 避免伸縮構造函數(telescoping constructor)

模板代碼

public final class User {// ① 所有字段 final,不可變private final String name;private final int age;private final String phone;// ② 私有構造,只接受 Builderprivate User(Builder builder) {this.name  = builder.name;this.age   = builder.age;this.phone = builder.phone;}// ③ 靜態內部 Builderpublic static class Builder {private String name;   // 必填private int age = -1;  // 可選默認值private String phone;public Builder(String name) { this.name = name; }public Builder age(int age)   { this.age = age; return this; }public Builder phone(String p){ this.phone = p; return this; }public User build() {// 參數校驗放這里if (age < 0) throw new IllegalArgumentException("age missing");return new User(this);}}// ④ Getter(無 Setter)public String name()  { return name; }public int age()      { return age; }public String phone() { return phone; }
}

客戶端鏈式調用

User user = new User.Builder("Alice").age(18).phone("13800138000").build();
優點缺點
可讀性高,鏈式流暢多寫 1 個 Builder 類
不可變,線程安全不適合參數極少或極多的極端場景
可在 build() 里集中校驗

Lombok 一行搞定

@Builder
public class User {private final String name;private final int age;private final String phone;
}

使用框架

系統源碼級(AOSP 自帶)

典型鏈式調用說明
AlertDialog.Buildernew Builder(context).setTitle(..).setPositiveButton(..).show()官方最經典示例

主流三方庫(日常必用)

建造者入口場景
OkHttpnew OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).build()網絡參數多
Retrofitnew Retrofit.Builder().baseUrl("https://api.xxx/").addConverterFactory(..).build()接口配置
GlideGlide.with(this).load(url).placeholder(R.drawable.loading).into(imageView)圖片加載鏈式 DSL

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

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

相關文章

網頁計時器,支持多計時器管理、數據分享、用戶數據同步、全屏展示等功能,可進行倒計時、正計時和顯示世界時鐘。

一個具有現代化 UI 和交互的計時器網頁應用&#xff0c;支持多計時器管理、數據分享、用戶數據同步、全屏展示等功能&#xff0c;可進行倒計時、正計時和顯示世界時鐘。它采用玻璃態設計和流暢動畫效果&#xff0c;提供極佳的視覺體驗。 特點&#xff1a; 支持多個計時器的創建…

紋理融合——用 TypeScript + Babylon.js 打造“可混合紋理序列”

我不想搞個一新的Shader&#xff0c;我就想用已有的材質&#xff08;比如StandardMaterial和PBRMetallicRoughnessMaterial&#xff09;實現紋理融合漸變等效果&#xff0c;于是我搞了一個TextureBlender。一、為什么重復造輪子&#xff1f;GPU 插值受限material.diffuseTextur…

【完整源碼+數據集+部署教程】公交車部件實例分割系統源碼和數據集:改進yolo11-fasternet

背景意義 隨著城市化進程的加快&#xff0c;公共交通系統的需求日益增加&#xff0c;公交車作為城市交通的重要組成部分&#xff0c;其運行效率和安全性直接影響到城市的交通狀況和居民的出行體驗。因此&#xff0c;公交車的維護和管理顯得尤為重要。在這一背景下&#xff0c;公…

【C++題解】關聯容器

關于set&#xff0c;map以及變種 |關聯容器| set&multiset | map&multimap |無序關聯容器| Unordered set&multiset | Unordered map&multimap | 建議先了解之后再配合練習 這次練習CCF真題比較多&#xff0c;也比較基礎&#xff0c;預計耗時不用這么久。 今天…

【智譜清言-GLM-4.5】StackCube-v1 任務訓練結果不穩定性的分析

1. Prompt 我是機器人RL方向的博士生正在學習ManiSkill&#xff0c;在學習時我嘗試使用相同命令訓練同一個任務&#xff0c;但是我發現最終的 success_once 指標并不是相同的&#xff0c;我感到十分焦慮&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id&qu…

MySQL 8.0 主從復制原理分析與實戰

MySQL 8.0 主從復制原理分析與實戰半同步復制設計理念&#xff1a;復制狀態機——幾乎所有的分布式存儲都是這么復制數據的基于全局事務標識符&#xff08;GTID&#xff09;復制GTID工作原理多主模式多主模式部署示例課程目標&#xff1a; MySQL 復制&#xff08;Replication&a…

[UT]記錄case中seq.start(sequencer)的位置變化帶來的執行行為的變化

現象&#xff1a; 代碼選擇打開57行&#xff0c;注釋掉60行執行&#xff0c;結果58行不會打印。 代碼選擇打開60行&#xff0c;注釋57行執行&#xff0c;結果58行正常打印。 sequence的執行需要時間&#xff01;&#xff01;&#xff01; SV中代碼57行切換到60行的區別&#xf…

利用keytool實現https協議(生成自簽名證書)

利用keytool實現https協議&#xff08;生成自簽名證書&#xff09;什么是https協議&#xff1f;https&#xff08;安全超文本傳輸協議&#xff09;是 HTTP 的安全版本&#xff0c;通過 SSL/TLS 加密技術&#xff0c;在客戶端&#xff08;如瀏覽器&#xff09;和服務器之間建立加…

拆解 AI 大模型 “思考” 邏輯:從參數訓練到語義理解的核心鏈路

一、引言&#xff1a;揭開 AI 大模型 “思考” 的神秘面紗?日常生活中的 AI 大模型 “思考” 場景呈現&#xff08;如 ChatGPT 對話、AI 寫作輔助、智能客服應答&#xff09;?提出核心問題&#xff1a;看似具備 “思考” 能力的 AI 大模型&#xff0c;其背后的運作邏輯究竟是…

element plus 使用細節 (二)

接上一篇文章&#xff1a; element plus 使用細節 最近菜鳥忙于系統開發&#xff0c;都沒時間總結項目中使用的問題&#xff0c;幸好還是在空閑之余總結了一點&#xff08;后續也會來補充&#xff09;&#xff0c;希望能給大家帶來幫助&#xff01; 文章目錄table fixed 的 v…

【機器學習學習筆記】numpy基礎2

零基礎小白的 NumPy 入門指南如果你想用電競&#xff08;打游戲&#xff09;的思路理解編程&#xff1a;Python 是基礎操作鍵位&#xff0c;而 NumPy 就是 “英雄專屬技能包”—— 專門幫你搞定 “數值計算” 這類復雜任務&#xff0c;比如算游戲里的傷害公式、地圖坐標&#x…

從自動化到智能化:家具廠智能化產線需求與解決方案解析

伴隨著工業4.0浪潮和智能制造技術的成熟&#xff0c;家具行業正逐步從傳統的自動化生產邁向智能化生產。智能化產線的構建不僅可以提升生產效率&#xff0c;還能滿足個性化定制和柔性制造的需求。本文以某家具廠為例&#xff0c;詳細解析智能化產線的核心需求&#xff0c;并提出…

macOS下基于Qt/C++的OpenGL開發環境的搭建

系統配置 MacBook Pro 2015 Intel macOS 12Xcode 14 Qt開發環境搭建 Qt Creator的下載與安裝 在Qt官網的下載頁面上下載&#xff0c;即Download Qt Online Installer for macOS。下載完成就得到一個文件名類似于qt-online-installer-macOS-x64-x.y.z.dmg的安裝包。 下一步 …

當液態玻璃計劃遭遇反叛者:一場 iOS 26 界面的暗戰

引子 在硅谷的地下代碼俱樂部里&#xff0c;流傳著一個關于 “液態玻璃” 的傳說 —— 那是 Apple 秘密研發的界面改造計劃&#xff0c;如同電影《變臉》中那張能改變命運的面具&#xff0c;一旦啟用&#xff0c;所有 App 都將被迫換上流光溢彩的新面孔。 而今天&#xff0c;我…

探究Linux系統的SSL/TLS證書機制

一、SSL/TLS證書的基本概念 1.1 SSL/TLS協議簡介 SSL/TLS是一種加密協議&#xff0c;旨在為網絡通信提供機密性、完整性和身份驗證。它廣泛應用于HTTPS網站、電子郵件服務、VPN以及其他需要安全通信的場景。SSL&#xff08;安全套接字層&#xff09;是TLS&#xff08;傳輸層安全…

python和java爬蟲優劣對比

Python和Java作為爬蟲開發的兩大主流語言&#xff0c;核心差異源于語法特性、生態工具鏈、性能表現的不同&#xff0c;其優勢與劣勢需結合具體場景&#xff08;如開發效率、爬取規模、反爬復雜度&#xff09;判斷。以下從 優勢、劣勢、適用場景 三個維度展開對比&#xff0c;幫…

Unity 槍械紅點瞄準器計算

今天突然別人問我紅點瞄準器在鏡子上如何計算&#xff0c;之前的吃雞項目做過不記得&#xff0c;今天寫個小用例整理下。 主體思想記得是目標位置到眼睛穿過紅點瞄準器獲取當前點的位置就可以。應該是這樣吧&#xff0c;&#xff1a;&#xff09; 武器測試結構 首先整個結構&am…

題解 洛谷P13778 「o.OI R2」=+#-

文章目錄題解代碼居然沒有題解&#xff1f;我來寫一下我的抽象做法。 題解 手玩一下&#xff0c;隨便畫個他信心的折線圖&#xff0c;如下&#xff1a; 可以發現&#xff0c;如果我們知道終止節點&#xff0c;那么我們就可以知道中間有多少個上升長度。&#xff08;因為它只能…

RTSP流端口占用詳解:TCP模式與UDP模式的對比

在音視頻傳輸協議中&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff0c;實時流傳輸協議&#xff09;被廣泛用于點播、直播、監控等場景。開發者在實際部署或調試時&#xff0c;常常會遇到一個問題&#xff1a;一路 RTSP 流到底占用多少個端口&#xff1f; 這…

websocket的key和accept分別是多少個字節

WebSocket的Sec-WebSocket-Key是24字節&#xff08;192位&#xff09;的Base64編碼字符串&#xff0c;解碼后為16字節&#xff08;128位&#xff09;的原始隨機數據&#xff1b;Sec-WebSocket-Accept是28字節&#xff08;224位&#xff09;的Base64編碼字符串&#xff0c;解碼后…