跟著GPT學設計模式之建造者模式

Builder 模式,中文翻譯為建造者模式或者構建者模式,也有人叫它生成器模式。允許你創建不同口味的對象同時避免構造器污染。當一個對象可能有幾種口味,或者一個對象的創建涉及到很多步驟時會很有用。

現實世界例子:想象一個角色扮演游戲的角色生成器。最簡單的選擇是讓計算機為你創建角色。但是如果你想選擇一些像專業,性別,發色等角色細節時,這個角色生成就變成了一個漸進的過程。當所有選擇完成時,該過程也將完成。

通過構造器、set函數創建對象沒有建造者模式靈活,也就是建造者具有這三個特性:依賴關系(Dependencies)、合法校驗(Preconditions)、不可變(Immutable)。

建造者模式的優點包括:

  • 分離構建和表示:通過建造者模式,將一個復雜對象的構建過程與其表示相分離,使得同樣的構建過程可以創建不同的表示形式。
  • 更好的封裝性和擴展性:可以將構建過程中的每個步驟封裝在具體的建造者中,使得對于產品的構建過程進行更加精細的控制和管理。
  • 避免構造函數參數過多:通過使用建造者模式,可以避免通過構造函數參數傳遞大量的可選參數,使得構造函數的定義更加簡潔明了。

建造者模式適用于需要創建復雜對象且對象的構建過程比較穩定的情況。如果對象的構建過程非常簡單或者對象的表示形式只有一種,可能并不適合使用建造者模式。在實際應用中,可以根據具體需求和設計的復雜程度來選擇是否使用建造者模式。

建造者模式的實現

說明

建造者模式(Builder Pattern)可以將一個復雜對象的構建過程與其表示相分離,使得同樣的構建過程可以創建不同的表示。

在軟件開發中,有時候需要創建一個復雜的對象,該對象可能由多個部分組成,且創建過程較為復雜。使用簡單的構造函數或者靜態工廠方法來創建對象可能會導致構造函數參數過多或者構造方法變得冗長復雜,不易于維護和擴展。這時,可以使用建造者模式來解決這個問題。

編程示例

有一個英雄要創建。

public final class Hero {private final Profession profession;private final String name;private final HairType hairType;private final HairColor hairColor;private final Armor armor;private final Weapon weapon;private Hero(Builder builder) {this.profession = builder.profession;this.name = builder.name;this.hairColor = builder.hairColor;this.hairType = builder.hairType;this.weapon = builder.weapon;this.armor = builder.armor;}
}

有創建者:

  public static class Builder {private final Profession profession;private final String name;private HairType hairType;private HairColor hairColor;private Armor armor;private Weapon weapon;public Builder(Profession profession, String name) {// 可以進行校驗參數if (profession == null || name == null) {throw new IllegalArgumentException("profession and name can not be null");}this.profession = profession;this.name = name;}public Builder withHairType(HairType hairType) {this.hairType = hairType;return this;}public Builder withHairColor(HairColor hairColor) {this.hairColor = hairColor;return this;}public Builder withArmor(Armor armor) {this.armor = armor;return this;}public Builder withWeapon(Weapon weapon) {this.weapon = weapon;return this;}public Hero build() {return new Hero(this);}}

使用:

var mage = new Hero.Builder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build();

對比構造器創建:

public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) {}

以上內容基于GPT創建和整理。

參考

  • 設計模式Java實現
  • 設計模式之美-王爭

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

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

相關文章

Vue:用IDEA開發Vue,標簽語法爆紅問題處理

一、場景描述 我在IDEA中,學習Vue課程。 入門學習時,是在html文件中,script引入vue.js文件方式。 此時,在html文件中用v-標簽,爆紅。 二、解決辦法 打開 菜單欄 File - Settings 選擇 Editor - Files Type&#xf…

《每天一個Linux命令》 -- (5)通過sshkey密鑰登錄服務器

歡迎閱讀《每天一個Linux命令》系列!在本篇文章中,將介紹通過密鑰生成,使用公鑰連接管理服務器。 概念 SSH 密鑰是用于安全地訪問遠程服務器的一種方法。SSH 密鑰由一對密鑰組成:公鑰和私鑰。公鑰存儲在遠程服務器上,…

軟件工程復習

一、題型 單項選擇題 20分 填空題 10分 判斷題 10分 簡答題 18分 應用題 12分 綜合題 30分 軟件程序數據文檔 軟件是無形的、不可見的邏輯實體 20世紀60年代末爆發軟件危機 軟件危機是指軟件在開發與維護過程中遇到的一系列嚴重的問題 …

理解 GET、POST、PATCH 和 DELETE 請求的參數傳遞方式

理解 GET、POST、PATCH 和 DELETE 請求的參數傳遞方式 本文將向您介紹在使用 GET、POST、PATCH 和 DELETE 請求時如何傳遞參數。通過詳細解釋每種請求的參數傳遞方式和示例代碼,您將了解如何正確地將數據發送到服務器并與之交互。 GET 請求的參數傳遞方式 在 GET…

CentOS 7.9安裝寶塔面板,安裝gitlab服務器

docker安裝方式比較慢,安裝包1.3GB 安裝后啟動很慢 docker logs q18qgztxdvozdv_gitlab-ce-gitlab-1 docker ps docker exec -it q18qgztxdvozdv_gitlab-ce-gitlab-1 sh cd /etc/gitlab cat initial_root_password 軟件商店安裝方式,失敗了2023.12…

clickhouse刪除partition分區數據

clickhouse分布式表tencent_table_20231208_DIST,本地表tencent_table_20231208_local; 30臺clickhouse存儲服務器; 本地表:tencent_table_20231208_local CREATE TABLE tencent_sz.tencent_table_20231208_local (id Int64 DEFA…

hook其他調試技巧

輸出堆棧信息 通過 android.util.Log 輸出當前線程的堆棧跟蹤信息。 function showStacks() {Java.perform(function () {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new() )); }) } 可以在需要的…

機器學習--稀疏學習

前置知識: 通常學習一次模型的過程如下:我們普遍為了獲取更好的模型效果,直接對原始數據學習,會造成過擬合、需要特征提取; 而若特征提取完后依舊有很多特征,還是會容易過擬合。這時候就需要特征降維和特…

[leetcode 前綴和]

525. 連續數組 M :::details 給定一個二進制數組 nums , 找到含有相同數量的 0 和 1 的最長連續子數組,并返回該子數組的長度。 示例 1: 輸入: nums [0,1] 輸出: 2 說明: [0, 1] 是具有相同數量 0 和 1 的最長連續子數組。示例 2: 輸入: nums [0,1,0] 輸出: …

笙默考試管理系統-MyExamTest----codemirror(48)

笙默考試管理系統-MyExamTest----codemirror(48) 目錄 笙默考試管理系統-MyExamTest----codemirror(48) 一、 笙默考試管理系統-MyExamTest----codemirror 二、 笙默考試管理系統-MyExamTest----codemirror 三、 笙默考試管…

C/C++端口復用SO_REUSEADDR(setsockopt參數),test ok

端口復用最常用的用途應該是防止服務器重啟時之前綁定的端口還未釋放或者程序突然退出而系統沒有釋放端口。這種情況下如果設定了端口復用,則新啟動的服務器進程可以直接綁定端口。如果沒有設定端口復用,綁定會失敗,提示ADDR已經在使用中——…

前端學習--React(5)

一、useReducer 管理相對復雜的狀態數據 定義一個reducer函數,根據action值的不同返回不同的狀態 在組件中調用useReducer并傳入reducer函數和狀態的初始值 事件發生時,通過dispatch函數分派一個對象,即通知reducer具體返回哪個狀態對應的操…

STM32 寄存器配置筆記——USART DMA發送

一、DMA介紹 直接存儲器存取(DMA)用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳 輸。無須 CPU 干預,數據可以通過 DMA 快速地移動,這就節省了 CPU 的資源來做其他操作。當產品對于時序要求較嚴格時,外設使用DMA的方式能夠減…

深入了解Java 8日期時間新玩法:DateTimeFormatter與ZoneOffset的使用

推薦語 在這篇文章中,我們將深入探討Java中的DateTimeFormatter和ZoneOffset類的功能和使用方法。這些類是在Java 8中引入的新的日期時間API的一部分,它們為我們提供了更靈活、更易用的日期和時間處理能力。盡管這些類在Java 8中已經出現,但…

ELK(六)—Filebeat安裝部署

目錄 一、介紹1.1特點1.2使用原因1.3結構圖1.4工作流程 二、安裝部署2.1下載2.2啟動2.3監控日志文件2.4自定義字段 三、連接Elasticsearch四、工作原理 一、介紹 Filebeat是一個輕量級的日志和文件數據收集器,屬于Elastic Stack(ELK Stack)中…

近期Chrome瀏覽器 不知哪個版本升級后原先http強制跳轉到https,導致服務端302強制跳轉到http也沒反應

關于Chrome更新http強制跳轉到https解決方法 近期Chrome瀏覽器 不知哪個版本升級后原先http強制跳轉到https,導致服務端302強制跳轉到http也沒反應一、F12檢查加載的Response Headers中有沒有Non-Authoritative-Reason二、找了資料后得到解決方案:三、找…

云原生數據庫是什么?它的作用是啥?

目前來說,各廠商的云原生數據庫在演進路線上分成了兩個略有不同的路徑來解決不同的問題。 一種是各大公有云廠商選擇的,優先保證上云兼容性的路線,就是基于存算分離架構對傳統數據庫進行改造的路線:通過把大量的日志操作放到后臺…

插入排序——直接插入排序和希爾排序(C語言實現)

文章目錄 前言直接插入排序基本思想特性總結代碼實現 希爾排序算法思想特性總結代碼實現 前言 本博客插入排序動圖和希爾排序視頻參考大佬java技術愛好者,如有侵權,請聯系刪除。 直接插入排序 基本思想 直接插入排序是一種簡單的插入排序法&#xff…

圖空圖床圖片外鏈系統源碼-支持自定義權限策略-圖片大小格式

含視頻搭建教程。 大致功能: 支持本地等多種第三方云儲存 AWS S3、阿里云 OSS、騰訊云 COS、七牛云、又拍云、SFTP、FTP、WebDav、Minio多種數據庫驅動支持,MySQL 5.7、PostgreSQL 9.6、SQLite 3.8.8、SQL Server 2017支持配置使用多種緩存驅動&#xff…

車聯網軟件定義汽車安全攻擊示例

目錄 導言 名詞解釋 TBox QNX介紹 ADB 威脅分析