设计模式-创建型-建造者模式

1.概念

建造者设计模式(Builder Design Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。

2.作用

用于简化对复杂对象的创建

3.应用场景

当我们有一个非常复杂的对象(属性很多)需要创建并初始化,传统的创建方法有两种:
使用有参构造器一次完成创建与初始化操作
使用构造器完成创建工作,使用set方法完成初始化操作
但上面两个方法都会有相同的问题——代码量太大,可读性差。
所以这个时候我们可以使用建造者模式。

4.特点

对象的构建过程与表示分离

5.类与对象关系

有以下角色:

  • 产品:我们实际要创建和使用的复杂对象
  • 抽象建造者:一个用来约束具体建造者的接口
  • 具体建造者:实际完成对象的初始化操作
  • 指挥者(可选):提供一些默认情况下的初始化配置

6.实现

假设我们现在要创建一个产品——Computer
它包含四个主要部分:CPU、RAM、存储(storage)和GPU。
Computer类(产品)和builder内部类(建造者)

// 产品类:Computer
public class Computer {private String cpu;private String ram;private String storage;private String gpu;// 私有构造方法,防止外部直接实例化private Computer(Builder builder) {this.cpu = builder.cpu;this.ram = builder.ram;this.storage = builder.storage;this.gpu = builder.gpu;}// 内部静态Builder类(建造者)public static class Builder {private String cpu;private String ram;private String storage;private String gpu;// 设置CPUpublic Builder setCpu(String cpu) {this.cpu = cpu;return this;}// 设置RAMpublic Builder setRam(String ram) {this.ram = ram;return this;}// 设置存储public Builder setStorage(String storage) {this.storage = storage;return this;}// 设置GPUpublic Builder setGpu(String gpu) {this.gpu = gpu;return this;}// 构建Computer对象public Computer build() {return new Computer(this);}}@Overridepublic String toString() {return ("Computer{" +"cpu='" +cpu +'\'' +", ram='" +ram +'\'' +", storage='" +storage +'\'' +", gpu='" +gpu +'\'' +'}');}
}

该例子中,我们可以看出:

  • 我们不能直接为Computer类的属性进行赋值,而是使用builder为其赋值
  • 在builder中进行赋值后从builder中取出值传递给Computer类,来完成初始化
  • 使用Builder类的各个set方法设置完属性后,使用build方法构建出对象

Director类(指挥者)(可选)

// 指挥者类(可选)  
public class ComputerDirector {  private Computer.Builder builder;  public ComputerDirector(Computer.Builder builder) {  this.builder = builder;  }  // 示例构建方法  public Computer constructGamingComputer() {  return builder  .setCpu("Intel i9")  .setRam("32GB")  .setStorage("1TB SSD")  .setGpu("NVIDIA RTX 3080")  .build();  }  // 其他构建方法可以根据需要添加  
}

指挥者类在这个例子中不是必须的,这里只是用来提供一些默认配置,让我们能更快的创建并初始化出一个对象

测试类

public class Main {  public static void main(String[] args) {  // 使用Builder直接构建  Computer gamingComputer = new Computer.Builder()  .setCpu("Intel i7")  .setRam("16GB")  .setStorage("512GB SSD")  .setGpu("NVIDIA RTX 3070")  .build();  System.out.println(gamingComputer);  // 使用Director构建(可选)  ComputerDirector director = new ComputerDirector(new Computer.Builder());  Computer highEndComputer = director.constructGamingComputer();  System.out.println(highEndComputer);  }  
}

正常使用建造者模式,我们需要使用Builder对象进行赋值,然后最终使用build方法创建对象。
使用指挥者后,因为里面已经有默认配置,所以可以直接创建出对象,更高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英文版本-带EXCEL函数的数据分析

一、问题: 二、表格内容 三、分析结果 四、具体的操作步骤: 销售工作表公式设计与数据验证 类别(Category)列公式: 在Category列(假设为D列),根据ProductCode在Catalogue工作表中查找…

三层交换机静态路由实验

1、前置知识 2、实验目的 3、实验器材: 3560-23PS交换机2台、主机4台、交叉线1根和直通网线4根。 4、实验规划及拓扑 实验要求: (1)在交换机A和交换机B上分别划分基于端口的VLAN: 交换机 VLAN 端口成员 交换机…

PLC与PLC跨网段通讯的几种方法:厂区组网实践

PLC通常通过以太网或其他工业网络协议(如PROFINET、Modbus TCP等)进行通信。当PLC位于不同的网段时,它们不能直接通信,需要特殊的配置或设备来实现通信,不同网段的PLC通讯变得尤为重要。 随着工业网络的发展和工业4.0概…

观察者模式和订阅模式

观察者模式和订阅模式在概念上是相似的,它们都涉及到一个对象(通常称为“主题”或“发布者”)和多个依赖对象(称为“观察者”或“订阅者”)之间的关系。然而,尽管它们有相似之处,但在某些方面也…

HarmonyOs鸿蒙开发实战(20)=>一文学会基础使用组件导航Navigation

敲黑板,以下是重点技巧。文章末尾有实战项目效果截图及代码截图可参考 1.概要 Navigation是路由导航的根视图容器Navigation组件主要包含​导航页(NavBar)和子页(NavDestination),导航页不存在页面栈中&am…

DevOps-Jenkins-新手入门级

1. Jenkins概述 1. Jenkins是一个开源持续集成的工具,是由JAVA开发而成 2. Jenkins是一个调度平台,本身不处理任何事情,调用插件来完成所有的工作 1.1 什么是代码部署 代码发布/部署>开发书写的程序代码---->部署测试/生产环境 web服务…

在win10下搭建ftp服务器

1 说明 本文档在win10下实现。 2 安装ftp服务器 打开“控制面板/程序和功能”,如下: 点击“启用或关闭windows功能”,如下: 安装“ftp服务器”,将下图红色圈中部分打勾,如下: 必须勾选…

数据结构C语言描述4(图文结合)--栈的实现,中序转后序表达式的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

vue中路由缓存

vue中路由缓存 问题描述及截图解决思路关键代码及打印信息截图 问题描述及截图 在使用某一平台时发现当列表页码切换后点击某一卡片进入详情页后,再返回列表页时页面刷新了。这样用户每次看完详情回到列表页都得再重新输入自己的查询条件,或者切换分页到…

如何在 UniApp 中实现 iOS 版本更新检测

随着移动应用的不断发展,保持应用程序的更新是必不可少的,这样用户才能获得更好的体验。本文将帮助你在 UniApp 中实现 iOS 版的版本更新检测和提示,适合刚入行的小白。我们将分步骤进行说明,每一步所需的代码及其解释都会一一列出…

移动充储机器人“小奥”的多场景应用(上)

一、高速公路服务区应用 在高速公路服务区,新能源汽车的充电需求得到“小奥”机器人的及时响应。该机器人配备有储能电池和自动驾驶技术,能够迅速定位至指定充电点,为待充电的新能源汽车提供服务。得益于“小奥”的机动性,其服务…

Redis 的代理类注入失败,连不上 redis

在测试 redis 是否成功连接时&#xff0c;发现 bean 没有被创建成功&#xff0c;导致报错 根据报错提示&#xff0c;需要我们添加依赖&#xff1a; <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>&l…

桌面怎么快速添加便签?适合桌面记事的便签小工具

在数字化时代&#xff0c;我们每天面对电脑处理大量任务&#xff0c;无论是工作计划、会议纪要还是个人生活琐事&#xff0c;都需要一个可靠的桌面记事工具来帮助我们记录和整理。因此&#xff0c;一款适合桌面使用的便签软件成为了我们不可或缺的助手。 敬业签就是这样一款功…

UE5 腿部IK 解决方案 footplacement

UE5系列文章目录 文章目录 UE5系列文章目录前言一、FootPlacement 是什么&#xff1f;二、具体实现 前言 在Unreal Engine 5 (UE5) 中&#xff0c;腿部IK&#xff08;Inverse Kinematics&#xff0c;逆向运动学&#xff09;是一个重要的动画技术&#xff0c;用于实现角色脚部准…

KLV6008固态继电器:高压应用的理想紧凑方案

在当今快节奏的电子领域&#xff0c;找到平衡性能、可靠性和安全性的组件至关重要。CRIA Semiconductor的KLV6008固态继电器(SSR)正是满足了这一要求。这款紧凑型继电器专为高压、低电流切换而设计&#xff0c;是适用于各种应用的多功能解决方案。 为什么选择KLV6008&#xff1…

在 Swift 中实现字符串分割问题:以字典中的单词构造句子

文章目录 前言摘要描述题解答案题解代码题解代码分析示例测试及结果时间复杂度空间复杂度总结 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 LeetCode - #140 单词拆分 II 不积跬步&#xff0c;无以至千里&#xff1b;不积小流&…

HarmonyOs鸿蒙开发实战(21)=>组件间通信@ohos/liveeventbus

1.简介 LiveEventBus是一款消息总线&#xff0c;具有生命周期感知能力&#xff0c;支持Sticky&#xff0c;支持跨进程&#xff0c;支持跨APP发送消息。 2.下载安装 ohpm install ohos/liveeventbus 3.订阅&#xff0c;注册监听 4.发送事件 5. 完成 > 记得关注博主&#xff…

OpenCV和Qt坐标系不一致问题

“ OpenCV和QT坐标系导致绘图精度下降问题。” OpenCV和Qt常用的坐标系都是笛卡尔坐标系&#xff0c;但是细微处有些不同。 01 — OpenCV坐标系 OpenCV是图像处理库&#xff0c;是以图像像素为一个坐标位置&#xff0c;即一个像素对应一个坐标&#xff0c;所以其坐标系也叫图像…

nohup java -jar supporterSys.jar --spring.profiles.active=prod

文章目录 1、ps -ef | grep java2、kill 13713、ps -ef | grep java4、nohup java -jar supporterSys.jar --spring.profiles.activeprod &5、ps -ef | grep java1. 启动方式进程 1371进程 19994 2. 主要区别3. 可能的原因4. 建议 1、ps -ef | grep java rootshipper:~# p…

Ubuntu上安装MySQL并且实现远程登录

目录 下载网络工具 查看网络连接 更新系统软件包&#xff1b; 安装mysql数据库 查看mysql数据库状态 以数字ip形式显示mysql的监听状态。&#xff08;默认监听端口是3306&#xff09; 查看安装mysql数据库时系统创建的目录信息。 根据查询到的系统用户名以及随机密码&a…