当前位置: 首页 > news >正文

编程-设计模式 4:建造者模式

设计模式 4:建造者模式

定义与目的
  • 定义:建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
  • 目的:该模式主要用于创建复杂对象时,这些对象的创建过程可能涉及多个步骤,并且可能需要不同的配置选项。建造者模式将构建过程表示分离,使得可以构建出不同配置的同一类型对象。
实现示例

假设我们要创建一个计算机对象,这个对象有很多配置选项,比如处理器、内存、硬盘等。我们可以使用建造者模式来创建不同配置的计算机实例。

// 定义产品类 - 计算机
public class Computer {// 计算机的处理器型号private String processor;// 计算机的内存大小(单位:GB)private int ram;// 计算机的硬盘大小(单位:GB)private int hardDrive;// 私有构造函数,仅允许通过 Builder 创建 Computer 实例// 参数 builder 用于从 Builder 类中获取处理器、内存和硬盘的信息private Computer(Builder builder) {this.processor = builder.processor;this.ram = builder.ram;this.hardDrive = builder.hardDrive;}// Builder 类,用于构建 Computer 实例public static class Builder {// 计算机的处理器型号private String processor;// 计算机的内存大小(单位:GB)private int ram;// 计算机的硬盘大小(单位:GB)private int hardDrive;// 设置处理器型号// 参数 processor 为处理器型号// 返回当前 Builder 实例,以便可以继续链式调用其他方法public Builder processor(String processor) {this.processor = processor;return this;}// 设置内存大小// 参数 ram 为内存大小(单位:GB)// 返回当前 Builder 实例,以便可以继续链式调用其他方法public Builder ram(int ram) {this.ram = ram;return this;}// 设置硬盘大小// 参数 hardDrive 为硬盘大小(单位:GB)// 返回当前 Builder 实例,以便可以继续链式调用其他方法public Builder hardDrive(int hardDrive) {this.hardDrive = hardDrive;return this;}// 构建 Computer 实例// 返回使用当前 Builder 实例创建的 Computer 实例public Computer build() {return new Computer(this);}}// Getter 方法,用于获取处理器型号public String getProcessor() {return processor;}// Getter 方法,用于获取内存大小public int getRam() {return ram;}// Getter 方法,用于获取硬盘大小public int getHardDrive() {return hardDrive;}// 重写 toString 方法,用于格式化输出 Computer 实例的信息@Overridepublic String toString() {return "Computer{" +"processor='" + processor + '\'' +", ram=" + ram +", hardDrive=" + hardDrive +'}';}
}// 客户端代码
public class Client {public static void main(String[] args) {// 创建一台配置较高的计算机Computer computerHighEnd = new Computer.Builder().processor("i9")      // 设置处理器型号为 i9.ram(32)             // 设置内存大小为 32 GB.hardDrive(1024)     // 设置硬盘大小为 1024 GB.build();            // 构建 Computer 实例// 创建一台配置较低的计算机Computer computerLowEnd = new Computer.Builder().processor("i3")     // 设置处理器型号为 i3.ram(4)             // 设置内存大小为 4 GB.hardDrive(128)     // 设置硬盘大小为 128 GB.build();           // 构建 Computer 实例// 输出高配置计算机的信息System.out.println(computerHighEnd);  // 输出: Computer{processor='i9', ram=32, hardDrive=1024}// 输出低配置计算机的信息System.out.println(computerLowEnd);   // 输出: Computer{processor='i3', ram=4, hardDrive=128}}
}
使用场景
  • 当你需要创建一个复杂对象,且该对象的构建过程需要分步骤进行时。
  • 当构建对象的不同配置需要不同的步骤时。
  • 当构建对象的步骤可能会发生变化时。

建造者模式通过将构建过程与表示分离,使得可以在不同的情况下使用相同的构建步骤来创建不同的对象配置。这对于创建复杂对象时非常有用,特别是在对象的构建过程需要多个步骤的情况下。

小结

建造者模式适用于创建具有多个可选部分的复杂对象。它提供了一种方式来逐步构建这些对象,同时保持代码的简洁性和可扩展性。

相关文章:

编程-设计模式 4:建造者模式

设计模式 4:建造者模式 定义与目的 定义:建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。目的:该模式主要用于创建复杂对象时,这些对象的创建过程可能涉及多个步骤,…...

百度文心一言API调用,千帆大模型获取API Key和API Secret图解

百度文心一言大模型调用教程,获取文心一言API Key和API Secret的方法,码笔记mabiji.com告诉大家在百度智能云的千帆大模型平台创建应用,即可获取文心一言的API Key和API Secret,详细流程如下: 1、在百度智能云的千帆大…...

kafka下载|安装

1、下载kafka https://kafka.apache.org/downloads 2、安装kafka 解压下载的kafka安装包即可 tar -xvf kafka_2.13-3.7.0.tgz -C /usr/local/3、查看kafka目录 bin目录:存放了脚本 config目录:主要存放了配置文件...

贪心算法part03

134 加油站 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行…...

以树莓集团的视角:探索AI技术如何重塑数字媒体产业发展

在科技日新月异的今天,AI技术如同一股不可阻挡的潮流,正深刻改变着我们的世界,尤其是数字媒体产业发展。作为数字产业生态链的杰出建设者,树莓集团始终站在时代前沿,积极探索AI技术如何为数字媒体产业注入新活力。 在树…...

package.json的 和 的区别,以及|| 和 | 的区别

在 package.json 文件中的 scripts 字段里,&& 和 & 用于连接不同的命令,它们的区别在于命令执行的方式和效果: &&: 用于串联两个命令,第一个命令成功(退出码为 0)后&#x…...

Wireshark_DNS_v7.0

Wireshark_DNS_v7.0 一、 nslookup 前置 nslookup 是一个网络命令行工具,用于查询域名系统(DNS)中的域名解析记录。通过使用 nslookup,你可以获取某个域名的IP地址,或者获取与某个IP地址关联的域名信息。 查看域名…...

阿里云的CentOS系统上安装Docker

在阿里云的CentOS系统上安装Docker的详细步骤如下: 一、前置条件 确保系统内核版本:Docker要求CentOS系统的内核版本高于3.10。你可以通过执行uname -r命令来查看当前系统的内核版本。卸载旧版本的Docker(如果已安装)&#xff1…...

力扣面试经典100题

进阶,其他解法 数组 88. 合并两个有序数组 - 力扣(LeetCode) 1、按非递减顺序合并两个数组 从末尾开始,用while分没到两个数组头,到第一个数组头,到第二个数组头三种情况 class Solution { public:voi…...

python打怪练习

1. 求一个数的幂值 def mi(a, b):c afor i in range(b-1):a a * creturn aprint(mi(2, 4))2. 输出斐波那契数列 def feibonaqi(n):l []a 1b 1for i in range(n):l.append(a)l.append(b)a b ab a bprint(l)feibonaqi(5)3. 输出特定字典数据 keys [name, old, score…...

excel下载模板,0KB或者乱码问题

Sptingboot项目 — maven打包,云效,docker,k8s 场景 — 导出excel模板 问题 1.乱码 2.下载为0KB,打开没有数据 模板内容 测试代码 测试方法 方法过程结果问题原因将文件直接放到服务器使用接口下载数据正常,排除文件问题排…...

JDBC连接Mysql数据库超详细讲解

JDBC连接Mysql数据库 如何导入驱动jar包 进入mysql官网 – https://www.mysql.com/ 点击下载找到方框内选项 点击 在项目文件夹创建lib文件 , 将下载好的驱动器导入 , 再添加到项目即可 步骤一:注册JDBC驱动 在Java中,要与数据库进行交互&…...

ArcGIS基础:自定义创建点线面等样式符号以方便使用

有时,使用ArcGIS自带的符号样式库无法满足我们使用要求,还需要进行调整,可能会浪费一些时间,那么自己新建一些样式符号备用, 需要的时候直接使用,会节省很多时间,大家学会之后,对学…...

蔚来2025届全球校招笔试/测评通关攻略北森测评题库更新了!

蔚来2025届全球校园招聘笔试/测评攻略 ​尊敬的各位考生,蔚来汽车2025届全球校园招聘笔试/测评环节即将开启。为了帮助您更好地准备并顺利通过这一环节,我们特此提供以下详细攻略。 一、考前准备 确认考试时间:请务必在截止日期前完成考试&am…...

如何在linux系统上部署Redis

<1>简介 Redis 全称 Remote Dictionary Server&#xff08;远程字典服务器&#xff09;&#xff0c;是一个高性能的(key/value)分布式内存数据库&#xff0c;基于内存运行并支持持久化的NoSQL数据库&#xff0c;是当前最热门的NoSql数据库之一,也被人们称为数据结构服务…...

操作系统开发行业的市场需求分析

操作系统作为计算机软件生态的核心&#xff0c;其开发不仅关乎技术的深度与广度&#xff0c;更与市场需求紧密相连。随着技术的不断进步和各行各业对数字化转型的迫切需求&#xff0c;操作系统开发行业面临着日益复杂且多样化的市场需求。以下从基础功能需求、技术创新需求、行…...

SpringMVC 的 拦截器

Spring MVC 提供了一套拦截器&#xff08;Interceptor&#xff09;机制&#xff0c;主要用于处理 Web 请求到达控制器之前或响应离开控制器之后执行一些操作。拦截器可以用于执行预处理&#xff08;如验证用户身份&#xff09;和后处理&#xff08;如清理资源或修改响应&#x…...

Redisson可重入锁原理(基于黑马视频总结,保姆级)

上一篇文章我们基于redis的set nx ex 命令以及Lua脚本实现了基本的分布式锁&#xff0c;但是还存在一下几点问题。于是又引出了redisson。 为什么基于SETNX的分布式锁无法实现可重入 先在method1中获取锁&#xff0c;获取成功后又调用method2&#xff0c;而method2内部也会获取…...

Ubuntu 安装 Watt-Toolkit

一、下载 Watt-Toolkit 下载Watt-Toolkithttps://steampp.net/download 二、设置 Watt-Toolkit 打开 Watt-Toolkit&#xff0c;点击 “网络加速→加速设置&#xff0c;打开证书文件夹” &#xff0c;当前证书路径为&#xff1a;/home/yammie/.local/share/Steam/Plugins/Acc…...

python中的省略号(...)

下面对python学习中遇到的省略号做个总结 # 1. 前言 在Python中&#xff0c;一切皆对象&#xff0c;...也是对象&#xff0c;它和对象Ellipsis是等价的。对象...和Ellipsis的类型都是ellipsis&#xff0c;代码示例如下。 print(Ellipsis) # 输出&#xff1a;Ellipsis print(…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...