【設計模式】建造者模式

建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個復雜的對象。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。

一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立于其他對象的。

介紹

意圖:將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。

主要解決:主要解決在軟件系統中,有時候面臨著"一個復雜對象"的創建工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個復雜對象的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對穩定。

何時使用:一些基本部件不會變,而其組合經常變化的時候。

如何解決:將變與不變分離開。

關鍵代碼:建造者:創建和提供實例,導演:管理建造出來的實例的依賴關系。

應用實例:?1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐"。 2、JAVA 中的 StringBuilder。

優點:

  • 分離構建過程和表示,使得構建過程更加靈活,可以構建不同的表示。
  • 可以更好地控制構建過程,隱藏具體構建細節。
  • 代碼復用性高,可以在不同的構建過程中重復使用相同的建造者。

缺點:

  • 如果產品的屬性較少,建造者模式可能會導致代碼冗余。
  • 建造者模式增加了系統的類和對象數量。

使用場景:?1、需要生成的對象具有復雜的內部結構。 2、需要生成的對象內部屬性本身相互依賴。

建造者模式在創建復雜對象時非常有用,特別是當對象的構建過程涉及多個步驟或參數時。它可以提供更好的靈活性和可維護性,同時使得代碼更加清晰可讀。

注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。

實現

我們假設一個快餐店的商業案例,其中,一個典型的套餐可以是一個漢堡(Burger)和一杯冷飲(Cold drink)。漢堡(Burger)可以是素食漢堡(Veg Burger)或雞肉漢堡(Chicken Burger),它們是包在紙盒中。冷飲(Cold drink)可以是可口可樂(coke)或百事可樂(pepsi),它們是裝在瓶子中。

我們將創建一個表示食物條目(比如漢堡和冷飲)的?Item?接口和實現?Item?接口的實體類,以及一個表示食物包裝的?Packing?接口和實現?Packing?接口的實體類,漢堡是包在紙盒中,冷飲是裝在瓶子中。

然后我們創建一個?Meal?類,帶有?Item?的?ArrayList?和一個通過結合?Item?來創建不同類型的?Meal?對象的?MealBuilderBuilderPatternDemo?類使用?MealBuilder?來創建一個?Meal

?

?

建造者模式的 UML 圖

步驟 1

創建一個表示食物條目和食物包裝的接口。

Item.java

public interface Item {public String name();public Packing packing();public float price();    
}

Packing.java

public interface Packing {public String pack();
}

步驟 2

創建實現 Packing 接口的實體類。

Wrapper.java

public class Wrapper implements Packing {@Overridepublic String pack() {return "Wrapper";}
}

Bottle.java

public class Bottle implements Packing {@Overridepublic String pack() {return "Bottle";}
}

步驟 3

創建實現 Item 接口的抽象類,該類提供了默認的功能。

Burger.java

public abstract class Burger implements Item {@Overridepublic Packing packing() {return new Wrapper();}@Overridepublic abstract float price();
}

ColdDrink.java

public abstract class ColdDrink implements Item {@Overridepublic Packing packing() {return new Bottle();}@Overridepublic abstract float price();
}

步驟 4

創建擴展了 Burger 和 ColdDrink 的實體類。

VegBurger.java

public class VegBurger extends Burger {@Overridepublic float price() {return 25.0f;}@Overridepublic String name() {return "Veg Burger";}
}

ChickenBurger.java

public class ChickenBurger extends Burger {@Overridepublic float price() {return 50.5f;}@Overridepublic String name() {return "Chicken Burger";}
}

Coke.java

public class Coke extends ColdDrink {@Overridepublic float price() {return 30.0f;}@Overridepublic String name() {return "Coke";}
}

Pepsi.java

public class Pepsi extends ColdDrink {@Overridepublic float price() {return 35.0f;}@Overridepublic String name() {return "Pepsi";}
}

步驟 5

創建一個 Meal 類,帶有上面定義的 Item 對象。

Meal.java

import java.util.ArrayList;
import java.util.List;public class Meal {private List<Item> items = new ArrayList<Item>();    public void addItem(Item item){items.add(item);}public float getCost(){float cost = 0.0f;for (Item item : items) {cost += item.price();}        return cost;}public void showItems(){for (Item item : items) {System.out.print("Item : "+item.name());System.out.print(", Packing : "+item.packing().pack());System.out.println(", Price : "+item.price());}        }    
}

步驟 6

創建一個 MealBuilder 類,實際的 builder 類負責創建 Meal 對象。

MealBuilder.java

public class MealBuilder {public Meal prepareVegMeal (){Meal meal = new Meal();meal.addItem(new VegBurger());meal.addItem(new Coke());return meal;}   public Meal prepareNonVegMeal (){Meal meal = new Meal();meal.addItem(new ChickenBurger());meal.addItem(new Pepsi());return meal;}
}

步驟 7

BuiderPatternDemo 使用 MealBuilder 來演示建造者模式(Builder Pattern)。

BuilderPatternDemo.java

public class BuilderPatternDemo {public static void main(String[] args) {MealBuilder mealBuilder = new MealBuilder();Meal vegMeal = mealBuilder.prepareVegMeal();System.out.println("Veg Meal");vegMeal.showItems();System.out.println("Total Cost: " +vegMeal.getCost());Meal nonVegMeal = mealBuilder.prepareNonVegMeal();System.out.println("\n\nNon-Veg Meal");nonVegMeal.showItems();System.out.println("Total Cost: " +nonVegMeal.getCost());}
}

步驟 8

執行程序,輸出結果:

Veg Meal
Item : Veg Burger, Packing : Wrapper, Price : 25.0
Item : Coke, Packing : Bottle, Price : 30.0
Total Cost: 55.0Non-Veg Meal
Item : Chicken Burger, Packing : Wrapper, Price : 50.5
Item : Pepsi, Packing : Bottle, Price : 35.0
Total Cost: 85.5

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

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

相關文章

微信小程序:Mobx的使用指南

簡要 微信小程序中有時需要進行全局狀態管理&#xff0c;這個時候就需要用到Mobx.下面我們來看一下在小程序中是如何使用Mobx的 安裝 pnpm i mobx-miniprogram4.13.2 mobx-miniprogram-bindings1.2.1 或 npm i mobx-miniprogram4.13.2 mobx-miniprogram-bindings1.2.1 或 yarn…

LeetCode 31題:下一個排列

目錄 題目 思路 代碼 題目 整數數組的一個 排列 就是將其所有成員以序列或線性順序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下這些都可以視作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整數數組的 下一個排列 是指其整數的下一個字典序…

Flink 火焰圖

方式一 使用 Flink Web UI 的 Flame Graph Flink 自己也支持了 Task 粒度的 Flame Graphs 功能&#xff0c;并且可以細化到 subtask 粒度。 第一步&#xff1a;配置啟用功能 Flink 作業動態參數里增加配置&#xff1a;“rest.flamegraph.enabled”: “true” 并重啟作業。當前…

Blazor 簡單組件(0):簡單介紹

文章目錄 前言說明環境安裝 前言 Blazor 這個技術還是比較新&#xff0c;相關的UI組件還在完善&#xff0c;我這里提供一下我個人的組件開發。 說明 本UI組件是基于BootstrapBlazor(以下簡稱BB)開發。 BootstrapBlazor 文檔 環境安裝 C#小輪子&#xff1a;Visual Studio自…

C語言快速回顧(二)

前言 在Android音視頻開發中&#xff0c;網上知識點過于零碎&#xff0c;自學起來難度非常大&#xff0c;不過音視頻大牛Jhuster提出了《Android 音視頻從入門到提高 - 任務列表》&#xff0c;結合我自己的工作學習經歷&#xff0c;我準備寫一個音視頻系列blog。C/C是音視頻必…

目前有哪些好用的免費開源wms倉儲管理軟件?

什么是開源&#xff1f; 開源指的是軟件的源代碼是公開可見和可自由使用的。開源軟件的授權許可通常允許用戶查看、修改和分發源代碼&#xff0c;以及根據自己的需求進行定制和擴展。 開源工具的核心理念是共享和協作。通過開放源代碼&#xff0c;開源軟件鼓勵用戶之間的合作…

Tubi 前端測試:遷移 Enzyme 到 React Testing Library

前端技術發展迅速&#xff0c;即便不說是日新月異&#xff0c;每年也都推出新框架和新技術。Tubi 的產品前端代碼倉庫始建于 2015 年&#xff0c;至今 8 年有余。可喜的是&#xff0c;多年來緊隨 React 社區的發展&#xff0c;Tubi 絕大多數的基礎框架選型都遵循了社區流行的最…

CentOS-6.3安裝MySQL集群

安裝要求 安裝環境&#xff1a;CentOS-6.3 安裝方式&#xff1a;源碼編譯安裝 軟件名稱&#xff1a;mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz 下載地址&#xff1a;http://mysql.mirror.kangaroot.net/Downloads/ 軟件安裝位置&#xff1a;/usr/local/mysql 數據存放位…

達夢數據庫(dm8) Centos7 高可用集群

國產數據庫-達夢 一、環境詳情二、Centos7 參數優化&#xff08;所有節點&#xff09;三、創建用戶&#xff08;所有節點&#xff09;四、開始安裝&#xff08;所有節點&#xff09;五、服務注冊啟動 當前安裝&#xff1a;在指定版本環境下 測試&#xff0c;僅供參考 官網描述&…

風丘科技將亮相 EVM ASIA 2023

風丘科技將首次亮相 EVM ASIA 2023 WINDHILL will debut EVM ASIA 2023 ——可持續移動的未來 —The Future of SUSTAINABLE Mobility EVM ASIA 2023是亞太地區電氣化的國際性展會&#xff0c;專注于新能源汽車、充電技術及汽車零件制造等。展會致力于促進包括充電站、交通…

[系統安全] 五十二.DataCon競賽 (1)2020年Coremail釣魚郵件識別及分類詳解

您可能之前看到過我寫的類似文章,為什么還要重復撰寫呢?只是想更好地幫助初學者了解病毒逆向分析和系統安全,更加成體系且不破壞之前的系列。因此,我重新開設了這個專欄,準備系統整理和深入學習系統安全、逆向分析和惡意代碼檢測,“系統安全”系列文章會更加聚焦,更加系…

InnoDB文件物理結構解析5 - FIL_PAGE_INDEX

本文討論FIL_PAGE_INDEX頁的可回收垃圾記錄(Garbage/Deleted Records)&#xff0c;當我們刪除某一條記錄(delete from …)時&#xff0c;通常InnoDB并不會在物理存儲上進行完全刪除&#xff0c;而是在記錄上置一個刪除標志位&#xff0c;我們稱這些行記錄為垃圾記錄&#xff0c…

嵌入式Qt開發—Excel表格數據導出

有一個嵌入式Excel表格數據導出的需求&#xff1a;應用軟件運行于嵌入式Linux平臺上&#xff0c;在設備運行過程中&#xff0c;存儲了許多數據&#xff0c;這些數據想以表格的形式導出。考慮到Windows平臺的普遍性&#xff0c;需要將數據以excel表格形式導出&#xff0c;故選擇…

python庫打包

一、背景 想讓自己寫的python庫可以使用pip install xxx安裝。 二、環境準備 注冊PYPI賬號已經寫好的能正常使用的庫/方法/項目&#xff08;可以本地調用&#xff09;安裝依賴庫setuptools和twinw pip install setuptools pip install twine # 簡化將庫發布到PYPI流程的工…

“中國軟件杯”飛槳賽道晉級決賽現場名單公布

“中國軟件杯”大學生軟件設計大賽是由國家工業和信息化部、教育部、江蘇省人民政府共同主辦&#xff0c;是全國軟件行業規格最高、最具影響力的國家級一類賽事&#xff0c;為《全國普通高校競賽排行榜》榜單內賽事。今年&#xff0c;組委會聯合百度飛槳共同設立了“智能系統設…

C++11之后的C++標準特性宏定義方便功能特性測試

C是一個龐大的編程語言體系&#xff0c;它的高效性是可以直接連接硬件系統&#xff0c;它的靈活性是不斷迭代完善的通用語義機制&#xff0c;當下C的發展演進可謂一路狂奔。不同應用中需要知道C對應的平臺或者版本的功能特性&#xff0c;標準庫信息、C編譯器特性等&#xff0c;…

基于PHP的輕量級博客typecho

本文完成于 5 月中旬&#xff0c;發布時未在最新版本上驗證&#xff1b; 什么是 typecho &#xff1f; Typecho 是一款基于 PHP 的博客軟件&#xff0c;旨在成為世界上最強大的博客引擎。Typecho 在 GNU 通用公共許可證 2.0 下發布。支持多種數據庫&#xff0c;原生支持 Markdo…

24屆近5年南京大學自動化考研院校分析

今天給大家帶來的是南京大學控制考研分析 滿滿干貨&#xff5e;還不快快點贊收藏 一、南京大學 學校簡介 南京大學是一所歷史悠久、聲譽卓著的高等學府。其前身是創建于1902年的三江師范學堂&#xff0c;此后歷經兩江師范學堂、南京高等師范學校、國立東南大學、國立第四中…

JS 刪除的是最后一頁的最后一條,頁碼設置邏輯

刪除的場景&#xff1a; 解決思路&#xff1a; 1、計算操作后的總頁數 2、刪除成功之后的總頁數與當前總頁數進行比較 3、如果刪除成功之后的總頁數比小于當前總頁數&#xff0c;需要把當前頁碼減去1&#xff1b;否則&#xff0c;直接進行列表數據的請求 代碼實現 /*總條數…

VBA 學習筆記1 對象以及屬性

目錄 1 取得VBA對象1.1 取得工作簿對象1.2 取得工作表對象1.3 取得單元格對象1.4 取得對象的屬性1.5 文檔的方法1 進入vba 界面 方式之一&#xff1a; 快捷鍵&#xff1a;ALTERF11 運行方式之一&#xff1a; 進入vba界面&#xff0c;點擊綠色三角符號 1 取得VBA對象 1.1 取得…