創建型模式 - 建造者模式 (Builder Pattern)

創建型模式 - 建造者模式 (Builder Pattern)

建造者模式是一種創建型設計模式,它將一個復雜對象的構建與表示分離,使得同樣的構建過程可以創建不同的表示。


需求描述
在游戲開發中,創建一個復雜的游戲角色,角色具有多種屬性,如姓名、性別、職業、武器等。不同類型的角色這些屬性的組合和設置方式可能不同。使用建造者模式可以將角色的創建過程和具體表示分離,方便創建不同類型的角色。

// 產品類:游戲角色
class GameCharacter {private String name;private String gender;private String profession;private String weapon;public void setName(String name) {this.name = name;}public void setGender(String gender) {this.gender = gender;}public void setProfession(String profession) {this.profession = profession;}public void setWeapon(String weapon) {this.weapon = weapon;}@Overridepublic String toString() {return "GameCharacter{" +"name='" + name + '\'' +", gender='" + gender + '\'' +", profession='" + profession + '\'' +", weapon='" + weapon + '\'' +'}';}
}// 抽象建造者類
abstract class CharacterBuilder {protected GameCharacter character;public GameCharacter getCharacter() {return character;}public void createNewCharacter() {character = new GameCharacter();}public abstract void buildName();public abstract void buildGender();public abstract void buildProfession();public abstract void buildWeapon();
}// 具體建造者類:戰士角色建造者
class WarriorBuilder extends CharacterBuilder {@Overridepublic void buildName() {character.setName("戰士-亞瑟");}@Overridepublic void buildGender() {character.setGender("男");}@Overridepublic void buildProfession() {character.setProfession("戰士");}@Overridepublic void buildWeapon() {character.setWeapon("大劍");}
}// 具體建造者類:法師角色建造者
class MageBuilder extends CharacterBuilder {@Overridepublic void buildName() {character.setName("法師-梅林");}@Overridepublic void buildGender() {character.setGender("男");}@Overridepublic void buildProfession() {character.setProfession("法師");}@Overridepublic void buildWeapon() {character.setWeapon("法杖");}
}// 指揮者類
class CharacterDirector {private CharacterBuilder builder;public CharacterDirector(CharacterBuilder builder) {this.builder = builder;}public GameCharacter constructCharacter() {builder.createNewCharacter();builder.buildName();builder.buildGender();builder.buildProfession();builder.buildWeapon();return builder.getCharacter();}
}// 客戶端代碼
public class GameCharacterBuilderExample {public static void main(String[] args) {// 創建戰士角色CharacterBuilder warriorBuilder = new WarriorBuilder();CharacterDirector warriorDirector = new CharacterDirector(warriorBuilder);GameCharacter warrior = warriorDirector.constructCharacter();System.out.println(warrior);// 創建法師角色CharacterBuilder mageBuilder = new MageBuilder();CharacterDirector mageDirector = new CharacterDirector(mageBuilder);GameCharacter mage = mageDirector.constructCharacter();System.out.println(mage);}
}

建造者模式拓展

使用這一種方式,就相當于代碼中調用方法者來充當指揮者角色。

public class Phone {private String cpu;private String screen;private String memory;private String brand;// 私有構造函數private Phone(Builder builder) {this.cpu = builder.cpu;this.screen = builder.screen;this.memory = builder.memory;	this.brand = builder.brand;}// 內部類構造器public static final class Builder {private String cpu;private String screen;private String memory;private String brand;public Builder cpu(String cpu) {this.cpu = cpu;return this;}public Builder screen(String screen) {this.screen = screen;return this;}public Builder memory(String memory) {this.memory = memory;return this;}public Builder brand(String brand) {this.brand = brand;return this;}// 利用 Java 內部類可以訪問外部類的私有成員變量的特性,調用私有構造方法返回 Phone 對象public Phone build() {return new Phone(this);}}
}// 使用的時候非常方便也非常清晰
Phone iPhone20 = new Phone.Builder().cpu("Apple A100").screen("LG屏幕").memory("三星內存").brand("Apple").build();// btw: 這種使用方式還是挺常見的, 在一些第三方庫配置 Config 的時候,例如 Rocket MQ 配置

小結
工廠方法模式 vs 建造者模式.
工廠方法注重的是整體的構建.
建造者模式注重零部件細節的過程.

抽象工廠模式 vs 建造者模式
抽象工廠注重的是相同的產品家族同一系列產品的構建。不關心構建過程,不同的產品交給不同的具體工廠去構建.
舉例,蘋果電腦工廠,你知道結果就是一臺蘋果電腦。而如果使用建造者模式.你需要知道每個零件由什么構成.你使用不同的零件組裝出來的就是不同的電腦.

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

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

相關文章

代碼隨想錄第二十天|二叉樹part08--669.修建二叉搜索樹、108.將有序數組轉換為二叉搜索樹、538.把二叉搜索樹轉換為累加樹

刷題小記: 上期學習了二叉搜索樹的插入和刪除操作,這次學習如何按區間修剪二叉搜索樹。還有兩題,關于借助二叉搜索樹的有序特性進行轉換。 669.修剪二叉搜索樹(669.修剪二叉搜索樹) 題目分析: 給定一個…

Fisher信息矩陣(Fisher Information Matrix,簡稱FIM)

Fisher信息矩陣簡介 Fisher信息矩陣(Fisher Information Matrix,簡稱FIM)是統計學和信息理論中的一個重要概念,廣泛應用于參數估計、統計推斷和機器學習領域。它以統計學家羅納德費希爾(Ronald Fisher)的名…

【初階數據結構】鏈表的柔光之美

目錄 一、為什么需要鏈表? 二、鏈表與數組的對比 三、鏈表節點定義 四、鏈表基本操作 1. 創建鏈表 2. 插入節點 頭插法(時間復雜度O(1)) 尾插法(時間復雜度O(n)) 3. 刪除節點 4. 遍歷鏈表 五、進階操作 1. 反…

《論湖倉一體架構及其應用》審題技巧 - 系統架構設計師

軟考論文寫作框架 一、考點概述 “湖倉一體架構及其應用”這一論題,主要考察了考生對現代數據管理系統中湖倉一體架構的理解、應用及問題解決能力。隨著5G、大數據、人工智能、物聯網等技術的快速發展,企業數據的管理需求正發生深刻變化。傳統的數據管…

MybatisPlus-擴展功能-枚舉處理器

在Mybatis里有一個叫TypeHandler的類型處理器,我們常見的PO當中的這些成員變量的數據類型,它都有對應的處理器,因此它就能自動實現這些Java數據類型與數據庫類型的相互轉換。 它里面還有一個叫EnumOrdinalTypeHandler的枚舉處理器&#xff0…

北京大學第二彈《DeepSeek提示詞工程和落地場景》

大家好,我是吾鳴。 之前給大家分享過北京大學出品的DeepSeek教程《DeepSeek與AIGC應用》,今天吾鳴發現北京大學又出第二版教程了,教程的名稱叫做《DeepSeek提示詞工程和落地場景》,在此分享給大家。文末有完整版PDF下載地址。 教程…

deepseek自動化代碼生成

使用流程 效果第一步:注冊生成各種大模型的API第二步:注冊成功后生成API第三步:下載vscode在vscode中下載agent,這里推薦使用cline 第四步:安裝完成后,設置模型信息第一步選擇API provider: Ope…

322.零錢兌換

class Solution(object):def coinChange(self, coins, amount):""":type coins: List[int]:type amount: int:rtype: int"""n len(coins) dp [float(inf)]*(amount 1) # 初始值為正無窮大dp[0] 0 # 一定要初始化為0if amount 0:return 0 …

ARM Cortex-M處理器中的MSP和PSP

在ARM Cortex-M系列處理器中,MSP(主堆棧指針)和PSP(進程堆棧指針)是兩種不同的堆棧指針,主要用于實現堆棧隔離和提升系統可靠性。以下是它們的核心區別和應用場景: 1. 基本定義 MSP(…

交換機與路由器連接方式

交換機和路由器連接的三種主要方式如下: 一、直連連接 這是最簡單直接的連接方式。通過一根網線將交換機的一個端口與路由器的一個LAN端口相連。這種連接方式適用于小型網絡,其中交換機負責局域網內部的數據交換,而路由器則負責將內部網絡連接…

Python代碼片段-Excel導入到MongoDB

有一次遇到一個需求,需要把Excel的數據導入到MongoDB中,表面上感覺就是導入數據很簡單,但實際操作后,發現是比較麻煩的一個事情,一般圖形化的工具對于MongoDB而言,導入選項都是json的,根本沒有E…

axios幾種請求類型的格式

Axios 是一個基于 Promise 的 HTTP 客戶端,廣泛用于瀏覽器和 Node.js 中發送 HTTP 請求。它支持多種請求格式,包括 GET、POST、PUT、DELETE 等。也叫RESTful 目錄 一、axios幾種請求類型的格式 1、get請求 2、post請求 3、put請求 4、delete請求 二…

手寫系列——MoE網絡

參考: MOE原理解釋及從零實現一個MOE(專家混合模型)_moe代碼-CSDN博客 MoE環游記:1、從幾何意義出發 - 科學空間|Scientific Spaces 深度學習之圖像分類(二十八)-- Sparse-MLP(MoE)網絡詳解_sparse moe…

Linux的基礎指令和環境部署,項目部署實戰(下)

目錄 上一篇:Linxu的基礎指令和環境部署,項目部署實戰(上)-CSDN博客 1. 搭建Java部署環境 1.1 apt apt常用命令 列出所有的軟件包 更新軟件包數據庫 安裝軟件包 移除軟件包 1.2 JDK 1.2.1. 更新 1.2.2. 安裝openjdk&am…

【藍橋杯】第十五屆省賽大學真題組真題解析

【藍橋杯】第十五屆省賽大學真題組真題解析 一、智能停車系統 1、知識點 (1)flex-wrap 控制子元素的換行方式 屬性值有: no-wrap不換行wrap伸縮容器不夠則自動往下換行wrap-reverse伸縮容器不夠則自動往上換行 (2&#xff0…

flink operator v1.10對接華為云對象存儲OBS

1 概述 flink operator及其flink集群,默認不直接支持華為云OBS,需要在這些java程序的插件目錄放一個jar包,以及修改flink配置后,才能支持集成華為云OBS。 相關鏈接參考: https://support.huaweicloud.com/bestpracti…

免費PDF工具

Smallpdf.com - A Free Solution to all your PDF Problems Smallpdf - the platform that makes it super easy to convert and edit all your PDF files. Solving all your PDF problems in one place - and yes, free. https://smallpdf.com/#rappSmallpdf.com-解決您所有PD…

去中心化技術P2P框架

中心化網絡與去中心化網絡 1. 中心化網絡 在傳統的中心化網絡中,所有客戶端都通過一個中心服務器進行通信。這種網絡拓撲結構通常是一個星型結構,其中服務器作為中心節點,每個客戶端只能與服務器通信。如果客戶端之間需要通信,必須…

muduo源碼閱讀:linux timefd定時器

?timerfd timerfd 是Linux一個定時器接口,它基于文件描述符工作,并通過該文件描述符的可讀事件進行超時通知。可以方便地與select、poll和epoll等I/O多路復用機制集成,從而在沒有處理事件時阻塞程序執行,實現高效的零輪詢編程模…

Pinia 3.0 正式發布:全面擁抱 Vue 3 生態,升級指南與實戰教程

一、重大版本更新解析 2024年2月11日,Vue 官方推薦的狀態管理庫 Pinia 迎來 3.0 正式版發布,本次更新標志著其全面轉向 Vue 3 技術生態。以下是開發者需要重點關注的升級要點: 1.1 核心變更說明 特性3.0 版本要求兼容性說明Vue 支持Vue 3.…