創建型:建造者模式

目錄

1、核心思想

2、實現方式

2.1 模式結構

2.2 工作流程

2.3?實現案例

2.4 變體:鏈式建造者(常見于多參數對象,無需指揮者)

3、優缺點分析

4、適用場景


1、核心思想

目的:將復雜對象的構建過程與其表示分離,使得同樣的構建過程可以創建不同的表示。

???????????建造者的制造過程不僅要分步完成,還要按照順序進行,所以建造者的各制造步驟與邏輯都應該被抽離出來獨立于數據模型。

2、實現方式

2.1 模式結構

四個核心結構:

  • Product(產品)?:復雜的產品類,構建過程相對復雜,需要其他組件組裝而成。
  • Builder(抽象建造者)?:建造者接口,定義了構成產品的各個組件的構建標準,通常有多個步驟。
  • ConcreteBuilder(具體建造者)?:具體的建造者實現類,可以有多種實現,負責產品的組裝但不包含整體建造邏輯。
  • Director(指揮者)?:持有建造者接口引用的指導者類,指導建造者按一定的邏輯進行建造。

2.2 工作流程

  1. 客戶端創建具體建造者實例,并傳遞給指揮者。

  2. 指揮者按預定步驟調用建造者的方法。

  3. 具體建造者逐步構建產品的各個部件。

  4. 最終由建造者返回組裝完成的產品。

2.3?實現案例

假設構建一個House對象,步驟包括打地基、建墻、裝屋頂和裝修。不同房屋類型(如木屋、磚房)的建造細節不同,但流程一致。

每一個房屋的結構一致,施工方(具體建造者)不同,會導致最終的房屋產品類型不同。所以如果需要擴展建造的房屋類型,只需要擴展增加具體建造者的實現(比如磚房建造者等),符合開閉原則

// 1、產品類
class House {private String foundation;private String walls;private String roof;// 省略getter/setter
}// 2、抽象建造者
interface HouseBuilder {void buildFoundation();void buildWalls();void buildRoof();House getResult();
}// 3、具體建造者:木屋
class WoodHouseBuilder implements HouseBuilder {private House house = new House();public void buildFoundation() { house.setFoundation("Wood Foundation"); }public void buildWalls() { house.setWalls("Wood Walls"); }public void buildRoof() { house.setRoof("Wood Roof"); }public House getResult() { return house; }
}// 4、指揮者
class ConstructionDirector {public House construct(HouseBuilder builder) {builder.buildFoundation();builder.buildWalls();builder.buildRoof();return builder.getResult();}
}// 5、客戶端使用
public class Client {public static void main(String[] args) {HouseBuilder builder = new WoodHouseBuilder();ConstructionDirector director = new ConstructionDirector();House house = director.construct(builder);}
}

2.4 變體:鏈式建造者(常見于多參數對象,無需指揮者)

// 產品類
class Person {private String name;private int age;// 其他屬性...// 建造者作為靜態內部類public static class Builder {private String name;private int age = 0; // 默認值public Builder(String name) { this.name = name; }public Builder age(int age) { this.age = age; return this; }public Person build() { return new Person(this); }}private Person(Builder builder) {this.name = builder.name;this.age = builder.age;}
}// 客戶端使用
Person person = new Person.Builder("Alice").age(30).build();

3、優缺點分析

優點:

  1. 分離構建與表示:客戶端無需了解內部構造細節。

  2. 靈活擴展:通過新增建造者支持新產品類型。

  3. 精細控制:分步驟構建,便于管理復雜對象的創建過程。

缺點:

  1. 代碼冗余:需編寫多個建造者類,增加代碼量。

  2. 適用范圍有限:僅當對象構造復雜或存在多種表示時適用。

4、適用場景

  • 對象包含多個部件,且構建過程需相同步驟。

  • 構造過程需支持不同配置或表示(如生成不同格式文檔)。

  • 需要創建的對象具有大量可選參數或復雜依賴。

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

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

相關文章

力扣-長度最小的子數組

1.題目描述 2.題目鏈接 LCR 008. 長度最小的子數組 - 力扣(LeetCode) 3.題目分析 這道題目我們使用的也是雙指針。我們可以定義兩個指針都指向數組第一個元素,然后使用right指針遍歷原數組,計算left指針到right指針之間的所有元…

JAVA開發工具延長方案

親測穩定的延長方案與避坑指南 真的搞不懂了,說點專業的術語竟然成了 QINQUAN。那就直接點,把這個方案帶給需要的開發者。 延長工具直通車 保姆級教程 延長方案https://mp.weixin.qq.com/s/uajM2Y9Vz6TnolzcLur_bw還是讓大家看看,發什么會被…

SpringAI開發SSE傳輸協議的MCP Server

SpringAI 訪問地址:Spring AI ? Spring AI?是一個面向人工智能工程的應用框架,由Spring團隊推出,旨在將AI能力集成到Java應用中。Spring AI的核心是解決AI集成的根本挑戰,即將企業數據和API與AI模型連接起來?。 MCP…

JAVA動態生成類

在java的加載過程一般都是要預先定義java類,然后通過經過加載->連接->初始化三步。連接過程又可分為三步:驗證->準備->解析。初始化的類是不允許修改。但是在日常的工作中有時候需要動態生成類,那第這種情況怎么辦呢? 可以這么處理: 1、先定義一個空的類,僅…

深入解析Java微服務架構:Spring Boot與Spring Cloud的整合實踐

深入解析Java微服務架構:Spring Boot與Spring Cloud的整合實踐 引言 隨著云計算和分布式系統的快速發展,微服務架構已成為現代軟件開發的主流模式。Java作為企業級應用開發的核心語言,結合Spring Boot和Spring Cloud,為開發者提…

03_基礎篇-NumPy(下):深度學習中的常用操作

03_基礎篇-NumPy(下):深度學習中的常用操作 通過上節課的學習,我們已經對NumPy數組有了一定的了解,正所謂實踐出真知,今天我們就以一個圖像分類的項目為例,看看NumPy的在實際項目中都有哪些重要…

時鐘識別項目報告(深度學習、計算機視覺)

深度學習方式 一、模型架構 本模型采用雙任務學習框架,基于經典殘差網絡實現時鐘圖像的小時和分鐘同步識別。 主干網絡 使用預訓練的ResNet18作為特征提取器,移除原分類層(fc層),保留全局平均池化后的512維特征向量。…

openai-whisper-asr-webservice接入dify

openai-whisper-asr-webservice提供的asr的api其實并不兼容openai的api,所以在dify中是不能直接添加到語音轉文字的模型中,對比了下兩個api的傳參情況,其實只要改動一處,就能支持: openai兼容的asr調用中formdata中音頻…

解鎖MySQL性能調優:高級SQL技巧實戰指南

高級SQL技巧:解鎖MySQL性能調優的終極指南 開篇 當前,隨著業務系統的復雜化和數據量的爆炸式增長,數據庫性能調優成為了技術人員面臨的核心挑戰之一。尤其是在高并發、大數據量的場景下,SQL 查詢的性能直接影響到整個系統的響應…

JavaScript 性能優化實戰指南

JavaScript 性能優化實戰指南 前言 隨著前端應用復雜度提升,JavaScript 性能瓶頸日益突出。高效的性能優化不僅能提升用戶體驗,還能增強系統穩定性和可維護性。本文系統梳理了 JavaScript 性能優化的核心思路、常見場景和實戰案例,結合代碼…

服務器磁盤按陣列劃分為哪幾類

以下是服務器磁盤陣列(RAID)的詳細分類及技術解析,基于現行行業標準與實踐應用: 一、主流RAID級別分類 1. ?RAID 0(條帶化)? ?技術原理?:數據分塊后并行寫入多塊磁盤,無…

鴻蒙 Location Kit(位置服務)

移動終端設備已經深入人們日常生活的方方面面,如查看所在城市的天氣、新聞軼事、出行打車、旅行導航、運動記錄。這些習以為常的活動,都離不開定位用戶終端設備的位置。 Location Kit 使用多種定位技術提供服務,可以準確地確定設備在室外/室…

二叉樹深搜:在算法森林中尋找路徑

專欄:算法的魔法世界 個人主頁:手握風云 目錄 一、搜索算法 二、回溯算法 三、例題講解 3.1. 計算布爾二叉樹的值 3.2. 求根節點到葉節點數字之和 3.3. 二叉樹剪枝 3.4. 驗證二叉搜索樹 3.5. 二叉搜索樹中第 K 小的元素 3.6. 二叉樹的所有路徑 …

企業級AI搜索解決方案:阿里云AI搜索開放平臺

隨著信息技術的飛速發展,搜索引擎作為信息獲取的重要工具,扮演著不可或缺的角色。阿里云 AI 搜索開放平臺以其強大的技術支持和靈活的開放性,持續為用戶提供高效的搜索解決方案。 一、阿里云 AI 搜索開放平臺 一站式的 AI 搜索開放平臺作為…

自動駕駛中的預測控制算法:用 Python 讓無人車更智能

自動駕駛中的預測控制算法:用 Python 讓無人車更智能 自動駕駛技術近年來取得了令人驚嘆的進步,AI 與邊緣計算的結合讓車輛能夠實時感知環境、規劃路徑并執行駕駛決策。其中,預測控制(Model Predictive Control,MPC) 作為一種先進的控制算法,憑借其對未來駕駛行為的優化…

量子計算機超越超級計算機——它們解決了哪些問題?

“ 南加州大學的研究人員取得了重大突破,證明量子計算機在解決某些復雜問題時甚至可以勝過最快的超級計算機。” 量子退火最終顯示出擴展優勢,得益于錯誤抑制的量子處理,它比傳統超級計算機提供更快、接近最優的解決方案。 南加州大學的研究人…

Java虛擬機 -方法調用

方法調用 方法調用靜態鏈接動態鏈接案例虛方法與非虛方法虛方法(Virtual Method)非虛方法(Non-Virtual Method) 方法返回地址 方法調用 我們編寫Java程序的時候,我們自己寫的類通常不僅僅是調用自己本類的方法。調用別…

【 開源:跨平臺網絡數據傳輸的萬能工具libcurl】

在當今這個互聯互通的世界中,數據在各種設備和平臺之間自由流動,而 libcurl,就像一把跨平臺的萬能工具,為開發者提供了處理各種網絡數據傳輸任務所需的強大功能。它不僅是一個庫,更是一種通用的解決方案,可…

ElasticSearch 8.x 快速上手并了解核心概念

目錄 核心概念概念總結 常見操作索引的常見操作常見的數據類型指定索引庫字段類型mapping查看索引庫的字段類型最高頻使用的數據類型 核心概念 在新版Elasticsearch中,文檔document就是一行記錄(json),而這些記錄存在于索引庫(index)中, 索引名稱必須是…

優化 CRM 架構,解鎖企業競爭力密碼

引言 “在所有企業面臨的挑戰中,客戶關系管理無疑是最為關鍵的一環。” —— 彼得德魯克 在數字化浪潮席卷的當下,企業面臨著前所未有的機遇與挑戰。客戶關系管理(CRM)作為企業運營的核心環節,其架構的優劣直接影響著…