【設計模式--創建型--建造者模式】

建造者模式

    • 建造者模式
      • 概述
      • 結構
      • 結果
      • 優缺點
      • 使用場景
    • 將上述案例改為鏈式調用
      • 結果

建造者模式

概述

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

  • 分離了部件的構建(由Builder來負責)和裝配(由Director負責)。從而可以構建出復雜的對象。這個模式適用于:某個對象的構建過程復雜的情況。
  • 由于實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的對象;相同的構建器,不同的裝配順序也可以做出不同的對象。實現了更好的復用。
  • 建造者模式可以將部件與其組裝過程分開,一步一步創建一個復雜對象。用戶只需要指定復雜對象的類型就可以獲得該對象,而無需知道內部的構造細節。

結構

建造者(Builder)模式包含如下角色:

  • 抽象建造者類(Builder):這個接口規定要實現復雜對象的那些部分的創建,并不涉及具體的部件對象的創建。
  • 具體建造者類(ConcreteBuilder):實現Builder接口,完成復雜產品的各個部件的具體創建方法。在構造過程完成后,提供產品的實例。
  • 產品類(Product):要創建的復雜對象
  • 指揮者類(Director):調用具體建造者來創建復雜對象的各個部分,在指導者中不涉及具體產品的信息,只負責保證對象各個部分完整創建或按某種順序創建。
    類圖:
    在這里插入圖片描述
/*** 抽象建造者類*/
public abstract class Builder {// 聲明computer類型的變量,并賦值protected Computer computer = new Computer();public abstract Computer createComputer();public abstract void builderMemory();public abstract void builderHardDrive();public abstract void builderMotherBoard();public abstract void builderPowerSource();public abstract void builderCpu();
}
/*** 電腦類*/
public class Computer {private String memory;private String hardDrive;private String motherBoard;private String powerSource;private String cpu;public String getMemory() {return memory;}public void setMemory(String memory) {this.memory = memory;}public String getHardDrive() {return hardDrive;}public void setHardDrive(String hardDrive) {this.hardDrive = hardDrive;}public String getMotherBoard() {return motherBoard;}public void setMotherBoard(String motherBoard) {this.motherBoard = motherBoard;}public String getPowerSource() {return powerSource;}public void setPowerSource(String powerSource) {this.powerSource = powerSource;}public String getCpu() {return cpu;}public void setCpu(String cpu) {this.cpu = cpu;}@Overridepublic String toString() {return "Computer{" +"memory='" + memory + '\'' +", hardDrive='" + hardDrive + '\'' +", motherBoard='" + motherBoard + '\'' +", powerSource='" + powerSource + '\'' +", cpu='" + cpu + '\'' +'}';}
}
/*** 指揮者類*/
public class Director {// 聲明builder類型的變量private Builder builder;public Director(Builder builder){this.builder =builder;}// 組裝電腦public Computer construct(){builder.builderMotherBoard();builder.builderCpu();builder.builderMemory();builder.builderHardDrive();builder.builderPowerSource();return builder.createComputer();}
}
/*** 聯想電腦構建者 實現抽象構建者類*/
public class LXComputerBuilder extends Builder{@Overridepublic Computer createComputer() {return computer;}@Overridepublic void builderMemory() {computer.setMemory("8G");}@Overridepublic void builderHardDrive() {computer.setMemory("512G");}@Overridepublic void builderMotherBoard() {computer.setMotherBoard("一塊好板");}@Overridepublic void builderPowerSource() {computer.setPowerSource("600w");}@Overridepublic void builderCpu() {computer.setCpu("i5");}
}
/*** 惠普電腦構建者 實現抽象構建者類*/
public class PHComputerBuilder extends Builder{@Overridepublic Computer createComputer() {return computer;}@Overridepublic void builderMemory() {computer.setMemory("16G");}@Overridepublic void builderHardDrive() {computer.setHardDrive("512G");}@Overridepublic void builderMotherBoard() {computer.setMotherBoard("普通的主板");}@Overridepublic void builderPowerSource() {computer.setPowerSource("500w");}@Overridepublic void builderCpu() {computer.setCpu("i7");}
}
public class Test01 {public static void main(String[] args) {// 創建指揮者類,傳入惠普電腦構建者類Director director = new Director(new PHComputerBuilder());// 調用指揮者類的構建方法,構建惠普電腦Computer construct = director.construct();System.out.println(construct.toString());}
}

結果

在這里插入圖片描述

優缺點

  • 優點:
    • 建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中,一般產品類和建造者類是比較穩定的,因此,將主要的業務邏輯封裝在指揮者類中對整體而而言可以取得比較好的穩定性。
    • 在建造者模式中,客戶端不必知道產品內部組成的細節,將產品本身與產品的創建過程解耦,使得相同的創建過程可以創建不同的產品對象。
    • 可以更加精細的控制產品的創建過程。將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰,也方便使用程序來控制創建過程。
    • 建造者模式很容易進行擴展。如果由新的需求,通過實現一個新的建造者類就可以完成,基本上不用修改之前的代碼,符合開閉原則。
  • 缺點:
    • 建造者模式所創建的產品一般具有較多共同點,其組成部分相似,如果產品之間差異很大,則不適用建造者模式,因此使用范圍受到一定的限制。

使用場景

建造者(Builder)模式創建的是復雜對象,其產品的各個部分經常面臨劇烈的變化,但是將他們組合在一起的算法卻相對穩定,所有通常在一下場合使用:

  • 創建的對象較復雜,由多個部件構成,各部件面臨復雜變化,但構建順序是相對穩定的
  • 創建復雜對象的算法獨立于該對象的組成部分以及它們的裝配方式,即產品的構建過程和最終的表示是獨立的

將上述案例改為鏈式調用

在這里插入圖片描述

/*** 電腦類*/
public class Computer {private String memory;private String hardDrive;private String motherBoard;private String powerSource;private String cpu;// 構造方法public Computer(Builder builder) {this.cpu = builder.cpu;this.hardDrive = builder.hardDrive;this.motherBoard = builder.motherBoard;this.powerSource = builder.powerSource;this.memory = builder.memory;}// 將創建者聲明為靜態內部類public static final class Builder {private String memory;private String hardDrive;private String motherBoard;private String powerSource;private String cpu;public Builder cpu(String cpu){this.cpu = cpu;return this; // 直接返回 this,即 Builder對象}public Builder powerSource(String powerSource){this.powerSource = powerSource;return this;}public Builder motherBoard(String motherBoard){this.motherBoard = motherBoard;return this;}public Builder hardDrive(String hardDrive){this.hardDrive = hardDrive;return this;}public Builder memory(String memory){this.memory = memory;return this;}// 直接調用Computer類的構造方法,傳入this,即 Builder對象public Computer build(){return new Computer(this);}}@Overridepublic String toString() {return "Computer{" +"memory='" + memory + '\'' +", hardDrive='" + hardDrive + '\'' +", motherBoard='" + motherBoard + '\'' +", powerSource='" + powerSource + '\'' +", cpu='" + cpu + '\'' +'}';}
}
public class Test02 {public static void main(String[] args) {Computer computer = new Computer.Builder().cpu("i9").hardDrive("2T").memory("32G").powerSource("1000w").motherBoard("華碩").build();System.out.println(computer);}
}

結果

在這里插入圖片描述

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

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

相關文章

辦公word-從不是第一頁添加頁碼

總結 實際需要注意的是,分隔符、分節符和分頁符并不是一個含義 分隔符包含其他兩個;分頁符:是增加一頁;分節符:指將文檔分為幾部分。 從不是第一頁插入頁碼1步驟 1,插入默認頁碼 自己可以測試時通過**…

win11 powershell conda 激活環境后不顯示環境名稱

win11 powershell conda 激活環境后不顯示環境名稱 問題現象解決方法 問題現象 安裝 Anaconda 后在 powershell 中激活環境后,命令行前面不顯示環境名稱 解決方法 在 powershell 中執行 conda init 重新打開 poweshell 出現以下問題,請參考 win11 p…

華為OD機試真題-5G網絡建設-2023年OD統一考試(C卷)

題目描述: 現需要在某城市進行5G網絡建設,已經選取N個地點設置5G基站,編號固定為1到N,接下來需要各個基站之間使用光纖進行連接以確保基站能互聯互通,不同基站之間架設光纖的成本各不相同,且有些節點之間已經存在光纖相連,請你設計算法,計算出能聯通這些基站的最小成本…

HarmonyOS鴻蒙應用開發——HTTP網絡訪問與封裝

文章目錄 基本使用封裝參考 基本使用 鴻蒙應用發起HTTP請求的基本使用,如下: 導入http模塊創建httpRequest對象發起http請求,并處理響應結果 第一、導入http模塊: import http from ohos.net.http第二、創建httpRequest對象&a…

二分查找|滑動窗口|前綴和|LeetCode209: 長度最小的子數組

長度最短的子數組 作者推薦 【動態規劃】【廣度優先】LeetCode2258:逃離火災 本文涉及的基礎知識點 二分查找算法合集 C算法:前綴和、前綴乘積、前綴異或的原理、源碼及測試用例 包括課程視頻 滑動窗口 題目 給定一個含有 n 個正整數的數組和一個正整數 target…

facebook回傳

1、引入依賴 首先引入依賴&#xff0c;這里我使用API v14.0&#xff1a; <dependency><groupId>com.facebook.business.sdk</groupId><artifactId>facebook-java-business-sdk</artifactId><version>14.0.0</version></dependen…

在IDEA中創建Maven項目時沒有src文件、不自動配置文件

錯誤示例&#xff1a; 沒有src文件&#xff0c;并且沒有自動下載相關的配置文件 對我這中情況無效的解決辦法&#xff1a; ①配置好下列圖中圈出來的文件 ②在VM選項中輸入&#xff1a;“-DarchetypeInternal” ③點擊應用&#xff0c;再點擊確定 ④還是不行 解決辦法&#x…

GridBagLayout GridBagConstraints 筆記231130

實例化使用模板 GridBagLayout gbl new GridBagLayout(); // gbl.columnWidths new int[]{200,200,200}; // 用數組設置列 // gbl.rowHeights new int[]{100,100,100,100,100}; // 用數組設置行GridBagConstraints gbc new GridBagConstraints();/*** gridBagConstrain…

14-1、IO流

14-1、IO流 lO流打開和關閉lO流打開模式lO流對象的狀態 非格式化IO二進制IO讀取二進制數據獲取讀長度寫入二進制數據 讀寫指針 和 隨機訪問設置讀/寫指針位置獲取讀/寫指針位置 字符串流 lO流打開和關閉 通過構造函數打開I/O流 其中filename表示文件路徑&#xff0c;mode表示打…

用Guava做本地緩存示例

緩存的作用 提升系統性能&#xff0c;暫時在內存中保存業務系統的數據處理結果&#xff0c;并且等待下次訪問使用 本地緩存和分布式緩存 緩存分為本地緩存與分布式緩存。本地緩存為了保證線程安全問題&#xff0c;一般使用ConcurrentMap的方式保存在內存之中&#xff0c;而常…

【KCC@南京】KCC南京“數字經濟-開源行”活動回顧錄

11月26日&#xff0c;由KCC南京、中科南京軟件研究所、傲空間、PowerData聯合主辦的 KCC南京“數字經濟-開源行” 的活動已圓滿結束。此次活動&#xff0c;3 場主題研討&#xff0c;11 場分享&#xff0c;現場參會人數 60&#xff0c;線上直播觀看 3000&#xff0c;各地小伙伴從…

Android畫布Canvas繪圖scale,Kotlin

Android畫布Canvas繪圖scale&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <androidx.appcompat.widget.LinearLayoutCompat xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.…

數據倉庫工具Hive

1. 請解釋Hive是什么&#xff0c;它的主要用途是什么&#xff1f; Hive是一個基于Hadoop的數據倉庫工具&#xff0c;主要用于處理和分析大規模結構化數據。它可以將結構化的數據文件映射為一張數據庫表&#xff0c;并提供類似SQL的查詢功能&#xff0c;將SQL語句轉換為MapRedu…

Windows 和 MacOS 上安裝配置ADB(安卓調試橋)

一、Android 調試橋 (ADB) Android 調試橋&#xff08;ADB&#xff09; 是一款多功能命令行工具&#xff0c;它讓你能夠更便捷地訪問和管理 Android 設備。使用 ADB 命令&#xff0c;你可以輕松執行以下操作 在設備上安裝、復制和刪除文件&#xff1b;安裝應用程序&#xff1…

YOLOV3 SPP 目標檢測項目(針對xml或者yolo標注的自定義數據集)

1. 目標檢測的兩種標注形式 項目下載地址:YOLOV3 SPP網絡對自定義數據集的目標檢測(標注方式包括xml或者yolo格式) 目標檢測邊界框的表現形式有兩種: YOLO(txt) : 第一個為類別,后面四個為邊界框,x,y中心點坐標以及h,w的相對值 xml文件:類似于網頁的標注文件,里面會…

力扣第 375 場周賽(Java)

文章目錄 T1 統計已測試設備代碼解釋 T2 雙模冪運算代碼解釋 T3 統計最大元素出現至少 K 次的子數組代碼解釋 T4 統計好分割方案的數目代碼解釋 鏈接&#xff1a;第 375 場周賽 - 力扣&#xff08;LeetCode&#xff09; T1 統計已測試設備 給你一個長度為 n 、下標從 0 開始的…

JavaEE 08 線程池簡介

前言 前面我們談完了定時器,單例模式,阻塞隊列等的操作并且做了模擬實現,今天我們再來說一說線程池的操作以及一些鎖策略. 注:本章幾乎均為理論篇,實踐較少. 下面就讓我們開始吧. 線程池 我們知道因為進程的頻繁創建和銷毀,帶來的開銷過大,我們無法接受,所以我們引入了更輕量級…

Linux常見壓縮指令小結

為什么需要壓縮技術 我們都知道文件是以byte作為單位的&#xff0c;如果我們的文件僅僅在低位占一個1 0000 0001這種情況我們完全可以壓縮一下&#xff0c;將高位的0全部抹掉即可。 如上所說是一種壓縮技術&#xff0c;還有一種就是將1111(此處省略96個)一共100個1&#xff0…

mysql執行帶函數命令的sql腳本報錯

一、前言 開發給了一個帶函數的sql文件讓我執行&#xff0c;但是執行導入時報以下錯誤 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled 二、解決 在數據庫命令行中執行以下命令&#xff08;臨時生效&…

HarmonyOS4.0從零開始的開發教程11給您的應用添加彈窗

HarmonyOS&#xff08;十&#xff09;給您的應用添加彈窗 概述 在我們日常使用應用的時候&#xff0c;可能會進行一些敏感的操作&#xff0c;比如刪除聯系人&#xff0c;這時候我們給應用添加彈窗來提示用戶是否需要執行該操作&#xff0c;如下圖所示&#xff1a; 彈窗是一種…