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

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

建造者模式

  • 建造者模式
    • 案例
    • 与工厂模式的区别:
    • @Builder 注解

建造者模式

建造者模式是将一个复杂对象的构件与表示分离,使得同样的构件过程可以创建不同的表示。
建造者模式将内部构件的创建和组装分割开,一般使用链式编程,代码整洁优雅

案例

建造者模式比较简单,这里就直接上代码了

以 RabbitMQClient 为例实现建造者模式

public class RabbitMQClient {// 私有构造,目标类的构造方法要传入一个Builder对象private RabbitMQClient(Builder builder){}// builder类位于目标类的内部,并且使用static修饰public static class Builder{// 保证不可变对象的密闭性private String host = "127.0.0.1";private int port = 5672;private int mode;private String exchange;private String queue;private boolean isDurable = true;int connectTime = 1000;public String getHost() {return host;}public Builder setHost(String host) {this.host = host;return this;}public int getPort() {return port;}public Builder setPort(int port) {this.port = port;return this;}public int getMode() {return mode;}public Builder setMode(int mode) {this.mode = mode;return this;}public String getExchange() {return exchange;}public Builder setExchange(String exchange) {this.exchange = exchange;return this;}public String getQueue() {return queue;}public Builder setQueue(String queue) {this.queue = queue;return this;}public boolean isDurable() {return isDurable;}public Builder setDurable(boolean durable) {isDurable = durable;return this;}public int getConnectTime() {return connectTime;}public Builder setConnectTime(int connectTime) {this.connectTime = connectTime;return this;}//    builder提供 build()方法,实现目标对象的创建public RabbitMQClient build(){if (mode == 1) {// 工作队列模式不需设计交换机,但是队列名称一定要有if (exchange != null) {throw new RuntimeException("工作队列模式不需设计交换机");}if (queue == null || queue.trim().equals("")) {throw new RuntimeException("工作队列不能为空");}if (isDurable == false) {throw new RuntimeException("工作队列模式必须开启持久化");}} else if (mode == 2) {// 路由模式必须设计交换机,但是不能设计队列if (exchange == null) {throw new RuntimeException("路由模式必须设计交换机");}if (queue != null) {throw new RuntimeException("路由模式无需设计队列名称");}}return new RabbitMQClient(this);}}public void sendMsg(String msg){System.out.println("发送消息:"  + msg);}}

测试代码如下:

@Test
public void builderTest(){RabbitMQClient client = new RabbitMQClient.Builder().setHost("192.168.11.111").setMode(1).setPort(5672).setQueue("queue-test").build();client.sendMsg("this is test");
}

与工厂模式的区别:

工厂模式注重整体对象的创建,建造者模式注重构件的创建,然后再将构件组装成一个完整的对象。
一般情况下,建造者模式创建的对象更复杂
工厂模式是生产工厂,建造者模式是组装工厂

这里引申一下建造者模式简单构件方法——使用lombok 包下面的 @Builder 注解

@Builder 注解

使用@Builder 注解 可以方便快捷使用 建造者模式
下面使使用案例

@Builder
public class RabbitMQClient2 {private String host = "127.0.0.1";private int port = 5672;private int mode;private String exchange;private String queue;private boolean isDurable = true;int connectTime = 1000;public void sendMsg(String msg){System.out.println("发送消息:"  + msg);}}

测试代码:

/*** lombok @Builder 注解使用*/
@Test
public void builder2Test(){RabbitMQClient2 client = RabbitMQClient2.builder().host("192.168.11.111").mode(1).port(5672).queue("queue-test").build();client.sendMsg("this is test");
}

相关文章:

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

建造者模式 建造者模式案例与工厂模式的区别:Builder 注解 建造者模式 建造者模式是将一个复杂对象的构件与表示分离,使得同样的构件过程可以创建不同的表示。 建造者模式将内部构件的创建和组装分割开,一般使用链式编程,代码整洁…...

PyQt中QFrame窗口中的组件不显示的原因

文章目录 问题代码(例)原因和解决方法 问题代码(例) from PyQt5.QtWidgets import * from PyQt5.QtGui import QFont, QIcon, QCursor, QPixmap import sysclass FrameToplevel(QFrame):def __init__(self, parentNone):super().…...

git 命令行回退版本

git 命令行回退版本 git 命令行回退版本命令: 1.切换到需要回退的分支 git checkout branch-v2.0.02.更新远程分支 git fetch3.找到需要回退版本的版本号git revert a6914da55ff40a09e67ac2426b86f1212e6580eb4.清除工作区缓存git clean -df5.强制提交git push -f...

IntelliJ IDEA 安装 GitHub Copilot插件 (最新)

注意: GitHub Copilot 插件对IDEA最低版本要求是2021.2,建议直接用2023.3,一次到位反正后续要升级的。 各个版本的依赖关系,请参照: ##在线安装: 打开 IntelliJ IDEA扩展商店,输入 "Git…...

viewpage选择器

GitHub - hackware1993/MagicIndicator: A powerful, customizable and extensible ViewPager indicator framework. As the best alternative of ViewPagerIndicator, TabLayout and PagerSlidingTabStrip —— 强大、可定制、易扩展的 ViewPager 指示器框架。是ViewPagerIndi…...

vue中如何将json数组指定的key赋值给el-form-item并均匀的分成2列

在Vue中&#xff0c;你可以使用v-for指令来遍历JSON数组&#xff0c;并将指定的key赋值给el-form-item。下面是一个示例&#xff1a; <template><el-form><el-row><el-col :span"6" v-for"item in jsonArray" :key"item.key&qu…...

笔记本分屏怎么操作?3个方法提高工作效率!

“有朋友知道笔记本怎么才能实现分屏吗&#xff1f;我在工作时&#xff0c;经常需要来回切换屏幕&#xff0c;效率真的太低了&#xff0c;有什么方法可以实现两个屏幕同时使用吗&#xff1f;” 在现代生活中&#xff0c;多任务处理已成为常态&#xff0c;而笔记本分屏技术为用户…...

Android 使用poi生成Excel ,word并保存在指定路径内

一添加依赖&#xff08;一定要用新版依赖防止一些bug&#xff09; minSdk 26 //注意最小支持SDK26 dependencies {implementation org.apache.poi:poi:5.2.4implementation org.apache.poi:poi-ooxml:5.2.4implementation javax.xml.stream:stax-api:1.0-2 }二&#xff0c;创…...

嵌入式杂记 -- MCU的大小端模式

MCU的大小端模式 大端模式小端模式大小端模式测试联合体概念MCU大小端模式测试大端模式测试小端模式测试 大小端模式转换 在进行MCU开发的时候&#xff0c;我们需要注意MCU的数据存储模式&#xff0c;在嵌入式中有两种不同的存储模式&#xff0c;分别是 大端模式和小端模式。 …...

对这套BI零售数据分析方案心动,是零售人天性

零售数据分析做了这么多年&#xff0c;难道真的没累积点经验&#xff0c;摸索出一条又快又能满足绝大多数需求的数据分析捷径&#xff1f;别人不知道&#xff0c;奥威BI还真就有这么一套标准化的BI零售数据分析方案&#xff0c;不管是服装零售、医药连锁、商超都能利用这套方案…...

vuekeyclock 集成

前端集成keycloak鉴权的主要写法&#xff0c; 在main.js里面写 import VueKeycloakJs from dsb-norge/vue-keycloak-js import { KeycloakInstance } from "keycloak-js";// 回调地址 const pageIndex process.env.NODE_ENV production ? http://xxxx/#/ : http:…...

ARM Linux 基础学习 / 配置交叉编译工具链 / 编译 Linux 应用和驱动 / 编译内核

编辑整理 by Staok。 本文部分内容摘自 “100ask imx6ull” 开发板的配套资料&#xff08;如 百问网的《嵌入式Linux应用开发完全手册》&#xff0c;在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO&#xff1a;开发板资料》或《2.2 全系列Linux教程&#xf…...

通讯协议学习之路(实践部分):SPI开发实践

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 本文…...

【系统安装】ubuntu20.04启动盘制作,正经教程,小白安装教程,百分百成功安装

1.所需材料&#xff1a; 64GBU盘&#xff08;其实8g和16g也可以&#xff09; 2.制作U盘启动盘 使用windows制作ubuntu 20.04启动盘 1&#xff09;下载制作工具&#xff1a;Rufus&#xff1a;Rufus - 轻松创建 USB 启动盘 2&#xff09;插入用来做启动盘的U盘 3&#xff0…...

2023云计算发展趋势

目录 一、云计算是什么&#xff1f; 二、云计算发展趋势 三、总结 一、云计算是什么&#xff1f; 云计算是一种基于互联网的计算方式&#xff0c;通过网络连接的方式提供计算能力、存储服务、应用程序和数据资源。它通常通过虚拟化技术实现多个计算机资源的池化&#xff0c;…...

C# .NET Core API Controller以及辅助专案

准备工作 Windows 10Visual Studio 2019(2017就有可以集中发布到publish目录的功能了吧)C#将方法封装(据说可以提高效率,就像是我们用的dll那种感觉新增专案作为我们API的辅助专案(作用类似dll&#xff0c;此处&#xff0c;你也可以在你自己的API专案里建文件夹&#xff0c;但…...

asp.net图书管理系统

asp.net图书管理系统 基本操作图书管理 读者管理 借书 修改资料 修改密码 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#winform架构和sql server数据库 功能模块&#xff1a; 图书管理 读者管理 借书 修改资料 修改…...

概念解析 | LoRA:低秩矩阵分解在神经网络微调中的作用

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:基于低秩矩阵分解的神经网络微调方法LoRA LoRA: Low-Rank Adaptation of Large Language Models LoRA由如下论文提出,详细信息请参见论文原文 https://arxiv.org/abs/2106.0968…...

前端---CSS的盒模型

文章目录 什么是盒模型&#xff1f;设置边框设置内边距设置外边距块级元素水平居中 什么是盒模型&#xff1f; 页面上的每个HTML元素都是一个一个的“盒子”&#xff0c;这些盒子由&#xff1a;内容、内边距、边框、外边距组成。 我们可以和住的房子联系起来&#xff0c;更好…...

Linux可以投屏到电视吗?用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开webcast.airdroid.com。这就是AirDroid Cast的网页版。你可以看到中间白色框框的右上角有个…...

别再手动改路径了!用LabVIEW + MATLAB Script做自动化测试,这份环境配置指南让你效率翻倍

LabVIEW与MATLAB深度整合&#xff1a;构建自动化测试系统的工程实践指南在工业自动化与测试测量领域&#xff0c;LabVIEW和MATLAB的组合堪称黄金搭档。LabVIEW擅长硬件接口和实时控制&#xff0c;而MATLAB在算法开发和数据分析方面具有无可比拟的优势。本文将深入探讨如何将两者…...

别再只用Service了!ROS1 Action通信保姆级教程:从导航进度条到任务取消,手把手教你实现带反馈的机器人任务

别再只用Service了&#xff01;ROS1 Action通信保姆级教程&#xff1a;从导航进度条到任务取消&#xff0c;手把手教你实现带反馈的机器人任务当你的机器人正在执行一个长达10分钟的导航任务时&#xff0c;突然发现目标点设置错误&#xff0c;这时候如果只能干等着任务完成或者…...

WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案

WTF Auto Layout? 实战&#xff1a;10个常见约束冲突案例解析与解决方案 【免费下载链接】wtfautolayout The source code for Why The Failure, Auto Layout? 项目地址: https://gitcode.com/gh_mirrors/wt/wtfautolayout 在iOS开发中&#xff0c;Auto Layout是构建灵…...

【数据结构与算法】数据结构基础——栈和队列

目录栈和队列1. 栈1.1 栈的概念1.2 栈的实现方式分析1.3 栈的实现1.3.1 栈的初始化与销毁1.3.2 入栈与出栈1.3.3 栈的判空与有效元素个数1.3.4 栈顶元素1.4 栈的扩展1.4.1 两栈共享空间2. 队列2.1 队列的概念2.2 队列的实现方式分析2.3 队列的实现2.3.1 队列的初始化与销毁2.3.…...

OmenSuperHub:基于WMI BIOS控制的高性能笔记本硬件管理方案

OmenSuperHub&#xff1a;基于WMI BIOS控制的高性能笔记本硬件管理方案 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 在惠…...

Linux平台终极Jellyfin客户端:如何用Tsukimi打造专业级媒体中心体验?

Linux平台终极Jellyfin客户端&#xff1a;如何用Tsukimi打造专业级媒体中心体验&#xff1f; 【免费下载链接】tsukimi A simple third-party Jellyfin client for Linux 项目地址: https://gitcode.com/gh_mirrors/ts/tsukimi 你是否厌倦了网页版Jellyfin的笨重体验&am…...

Unity项目实战:用TriLib插件动态加载FBX模型,5分钟搞定外部资源读取

Unity项目实战&#xff1a;用TriLib插件高效加载外部FBX模型的完整指南在VR展示、产品配置器等需要动态加载用户上传模型的场景中&#xff0c;如何快速实现外部FBX文件的读取是许多Unity开发者面临的挑战。传统的手动导入方式不仅效率低下&#xff0c;更无法满足运行时动态加载…...

从XAI到HXAI:构建以人为中心的可解释AI框架与实践

1. 项目概述&#xff1a;从“黑箱”到“白盒”&#xff0c;构建可信AI的演进之路在机器学习项目里摸爬滚打了十几年&#xff0c;我见过太多因为模型“说不清道不明”而引发的信任危机。一个在测试集上表现完美的信用评分模型&#xff0c;可能因为无法向风控专家解释“为什么拒绝…...

3步快速恢复加密压缩包密码:ArchivePasswordTestTool终极指南

3步快速恢复加密压缩包密码&#xff1a;ArchivePasswordTestTool终极指南 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 面对遗忘的加密压…...

DeepSeek代码审查能力白皮书(2024企业级实测报告)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek代码审查能力白皮书&#xff08;2024企业级实测报告&#xff09;概述 本报告基于2024年Q1至Q3期间&#xff0c;面向金融、电信与云原生三大垂直行业的17家头部企业客户开展的深度实测&#xff0c;覆盖…...