优雅使用Builder模式(构建者模式)

火遍全网的Hutool,如何使用Builder模式构建线程池 前言 Builder 设计模式也叫做构建者模式或者建造者模式,名字只是一种叫法,当聊起三种名称的时候知道是怎么回事就行 Builder 设计模式在作者编码过程中,属于比较常用的模式之一。优秀的设计模式总是会受到广大开发者的青睐,Hutool 也是其中之一 因为上周编写的业务需要用到线程池,就去 Hutool thread 包下看了看,还真有惊喜,学习到了一种之前编码中没用过的 Builder 模式实现 这里必须提一句:设计模式重要的是思想,一种设计模式可能不止一种实现方式 Builder 模式文. 阅读详情

优雅使用Builder模式(构建者模式)

简单介绍

Builder 模式是一种创建型设计模式,用于构建复杂对象,强调的是 管理依赖关系或者约束条件。它允许构建一个包含许多可选参数的对象,同时保持构造函数的简洁性。

在 Builder 模式中,通常会定义一个 Builder 类,用于设置对象的各个参数,最后通过调用 build 方法来构建对象。这样可以避免构造函数参数过多导致的混乱,同时还可以保证对象在构建过程中处于一种一致的状态。

优雅使用

干巴巴的文字总是抽象的,我这边就直接上代码好了。

假设我们有一个 HttpParameters 类用于封装 HTTP 请求的参数。这个类包含一个静态内部类 Builder,用于构建 HttpParameters 对象。下面我们将展示如何使用 Builder 模式来构建 HttpParameters 对象:

首先是 HttpParameters 类:

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

@Getter
@AllArgsConstructor
public class HttpParameters {
    private Builder builder;

    public static Builder newBuilder() {
        return new Builder();
    }

    @Getter
    public static class Builder {
        private String url;
        private Object parameter;
        private String httpType;

        public Builder parameter(Object parameter) {
            this.parameter = parameter;
            return this;
        }

        public Builder url(String url) {
            this.url = url;
            return this;
        }

        public Builder httpType(String httpType) {
            this.httpType = httpType;
            return this;
        }

        public HttpParameters build() {
            // 执行校验
            validate(); 

            // ... 其他的构建逻辑
            return new HttpParameters(this);
        }

        private void validate() {
            if (StringUtils.isBlank(url)) {
                throw new IllegalStateException("URL cannot be blank");
            }
            if (parameter == null) {
                throw new IllegalStateException("Parameter cannot be null");
            }
            if (StringUtils.isBlank(httpType)) {
                throw new IllegalStateException("HTTP type cannot be blank");
            }
            // 可以添加更多的校验逻辑
        }
    }
}

下面是使用 Builder 模式构建的 HttpParameters :

import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

public class Main {
    public static void main(String[] args) {
        // 使用静态方法 newBuilder() 创建 Builder 对象
        HttpParameters.Builder builder = HttpParameters.newBuilder();

        // 使用 Builder 对象设置参数
        builder.url("https://example.com/api/endpoint")
                .httpType("GET")
                .parameter("someParameter");

        // 构建 HttpParameters 对象
        HttpParameters httpParameters = builder.build();

        // 使用 @Getter 注解确保可以访问 Builder 类中定义的字段
        System.out.println("URL: " + httpParameters.getBuilder().getUrl());
        System.out.println("HTTP Type: " + httpParameters.getBuilder().getHttpType());
        System.out.println("Parameter: " + httpParameters.getBuilder().getParameter());
    }
}

或者:

public class Main {
    public static void main(String[] args) {
        HttpParameters httpParameters = HttpParameters.newBuilder()
                .url("https://example.com/api/endpoint")
                .httpType("GET")
                .parameter("someParameter")
                .build();

        System.out.println("URL: " + httpParameters.getBuilder().getUrl());
        System.out.println("HTTP Type: " + httpParameters.getBuilder().getHttpType());
        System.out.println("Parameter: " + httpParameters.getBuilder().getParameter());
    }
}

在上面的代码中,我们使用 Builder 模式构建了一个 HttpParameters 对象,然后通过链式调用优雅地设置了 url、httpType和parameter这些变量,最后最后调用 build 方法来构建对象同时进行相应的参数校验。可以看出Builder 模式使得构建复杂对象的过程更加灵活和可控。

应用场景

Builder 模式应用场景:如果类的属性之间有一定的依赖关系或者约束条件,那么就可以考虑使用 Builder 设计模式。

Builder 模式通常在以下情况下特别有用:

  1. 构建复杂对象: 当您需要创建具有许多可选参数的复杂对象时,Builder 模式可以提供一种优雅的方式来构建对象,避免使用过多的构造函数参数。
  2. 避免重叠构造函数: 当类具有多个构造函数,且参数列表重叠或非常相似时,Builder 模式可以提供一种更清晰的构建过程,使代码更易于阅读和维护。
  3. 参数校验: 使用 Builder 模式可以在构建对象的过程中执行参数校验,确保所有必要的参数都已设置,并在必要时抛出异常,使得代码更加健壮和可靠。
  4. 创建不可变对象: 当您希望创建不可变对象时,可以在 Builder 模式中设置对象的属性,并在构建后使得对象不可变,提高对象的安全性和线程安全性。
手把手教你用Nangate 45nm开源工艺库搞定数字电路仿真(附FreePDK资源) 本文详细介绍了如何使用Nangate 45nm开源工艺库进行数字电路仿真,包括环境搭建、关键文件解析、仿真环境配置及低功耗设计等实战内容。特别推荐FreePDK资源,帮助读者快速掌握从理论到实践的全流程操作,适用于学术研究和小规模数字电路设计。 阅读详情

相关推荐

手把手教你用IN-Sight智能相机实现双向TCP/IP通讯(附网络调试助手推荐)

本文详细解析了IN-Sight智能相机实现双向TCP/IP通讯的完整流程。通过将相机同时配置为TCP服务器和客户端,构建了与上位机(如PLC、MES)稳定可靠的数据交换通道。文章深入剖析了发送(TCPDevice)与接收(ReadDevice)通道的独立配置、关键参数设置(如结束符CR+LF)、高效调试工具选择以及实战避坑指南,帮助工程师快速掌握这一构建柔性产线数据节点的核心技术。

qsc9012345的博客 671

Java设计模式实战-Builder

1.使用场景Builder模式主要用于复杂对象(构造方法的参数过多)的创建、对象构造参数可选配置、创建不可变对象。实际开发多用于开源框架中配置对象的创建。详见 3.范例演示 下面首先介绍为啥要用Builder模式创建对象? >>使用共有构造方法的问题: 不能灵活控制可选构造参数,使用包含所有参数的构造方法,不需要的参数也必须传,同时容易出现参数错位,不很容易发现。(构造方法重载可解决) 通过重载

Myron_007的博客 2180

MC33PT2000控制详解一:PT2000 Dev Studio工具的使用

MC33PT2000共可控制6个高低端(如控制6个高压喷油器),1个高低端(如控制高压油泵)和DC-DC模块(如升压到65V).

m0_69929716的博客 1359

阿里云总线CSB的HTTP调用案例

阿里云总线CSB的HTTP调用案例 因为在实际开发过程中出现参数传入无效原因,因此记录下,话不多说直接上代码!(以Content-Type: application/json请求为例) HttpParameters.Builder builder = new HttpParameters.Builder(); Map<String, Object> kvMap = new HashMap<String, Object>(); build

weixin_47305973的博客 5239

python指纹识别算法(亲测代码可用)

python指纹识别算法

2301_76482796的博客 3079

岭回归的MATLAB步骤

MATLAB 实现框架,它涵盖了从数据导入到岭回归的步骤,包括计算共线性、使用 MAE、MSE、R²、MAPE 进行评价,以及绘制相应的可视化图表。

subject625Ruben的博客 1090

javax.net.ssl.SSLException: Connection reset

请求第三方https协议API接口时抛出javax.net.ssl.SSLException: Connection reset 之前的demo写法是: HttpParameters.Builder builder = HttpParameters.newBuilder(); builder.requestURL(url) // 设置请求的URL .api(method) // 设置服务名 .version(api_version) // 设置版本号 .metho

aigezi_cdd的博客 2万+

TLS回调函数–一文看懂(详)

TLS回调函数 CTF RE

Joyce_hjll的博客 3734

Http请求参数详解

http请求参数之Query String Parameters、Form Data、Request Payload HTTP请求中不同的请求方式和设置不同的Content-Type时,参数传递的方式会不一样,一起了解这三种形式:Query String Parameters、Form Data、Request Payload; GET请求 Query String Parameters GET请求时,参数会以url string 的形式进行传递,即?后的字符串则为其请求参数,并以&amp...

mingyuli的博客 1万+

思科—OSPF多区域配置实验

实验目的:配置OSPF多区域,使得不同网段的PC互相ping通。 网络拓扑如下: R0的配置 Router>en Router#conf t Router(config)#int g0/1 Router(config-if)#ip add 192.168.1.1 255.255.255.0 Router(config-if)#no shut Router(config-if)#exit Router(config)#int g0/0 Router(config-if)#ip add 192.168.

m0_46237205的博客 1万+

n8n智能体开发:Microsoft Outlook 节点

使用 Microsoft Outlook 节点可以自动化 Microsoft Outlook 工作流程,并将其与其他应用程序集成。n8n 内置支持多种 Microsoft Outlook 功能,包括创建、更新、删除和获取文件夹、邮件及草稿等操作。

王国平的博客 570

java中的.builder()方法实现详解

文章目录一。简介二。场景模拟三。java实现四。使用lombok插件进行优化 一。简介 1.我们在构建对象的时候,如果对象属性比较多,我们可以 使用一个构造器; 一个空的构造器,然后使用setter方法进行设置。 使用这些方法时会有冗长的构造函数或者setter方法,有不同参数默认值的构造函数需要多次定义,因此我们可以使用builder来简化代码的简介性。 2.那么什么是Builder呢? 它其实是一种设计模式,叫做建造者模式,它的含义是将一个复杂的对象的构建与它的表示分离,同样的构建过程可以创建不同

爱吃鸡腿的明仔 4万+

图像分割 - 使用Mask R-CNN模型在COCO数据集上进行图像分割任务

图像分割是计算机视觉领域的一个重要任务,它旨在将图像中的每个像素分类为对象或背景。Mask R-CNN是一种基于区域的卷积神经网络,可用于图像分割任务。它是Faster R-CNN的扩展,将目标检测与图像分割结合起来,能够同时检测和分割对象。在本博客中,我们将使用Mask R-CNN模型在COCO数据集上进行图像分割任务。我们将介绍如何下载和准备COCO数据集,以及如何使用Mask R-CNN模型进行训练和推理。

斌擎科技 1189

Java Builder构建对象

【代码】Java Builder构建对象。

Excellent999的博客 268

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

mybatis源码解读:builder构建者(一)

其实一个框架或者是系统要想运转,支撑他们运行的规则很重要,比如游戏如果没有游戏规则,那么就会变得毫无游戏体验,乃至一个社团或者公司可以健康高速的运转,也离不开一个强壮的并且必须要遵守的规则,如果没有奖罚措施,公司倒闭是迟早的事情。 对于mybatis来说,如何让一段xml配置可以识别为它自己可以理解的东西,这其实就是mybatis的开发团队定制好的一段规则,然后让大家来遵守,如果是你自己写框架,那么这个规则就是由你来定制了,哈哈。 builder builder下的类是mybatis解析xml的核心。 .

qq_41063182的博客 1793

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

同事写了一个疯狂的类构造器,我要疯了,Builder 模式都不会么?!!

疯狂的类构造器 最近栈长在做 Code Review 时,发现一段创建对象的方法: Task task = new Task(112, "紧急任务", "处理一下这个任务", 90, 3, 1, 36, "刘主管", 18, "客服1", "11, 12, 13", "客服3, 客服4, 客服5", true, new Date(), new Date(), new Date(), new

Java技术栈,分享最主流的Java技术 1万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

设计模式-构建者(Builder)模式详解

上面的写法虽然效率高,但也有一些不足,对于代码后期维护和协同开发会是一件很痛苦的事情。是不是很优雅,而且在很多框架中也能看到这样写的身影。没错这就是接下来要讲的构建者模式,这样好处是易于扩展和类的使用,但同时也失去了一些效率。

xiaoshitou_2015的博客 727

构建者builder模式

  遇到多个构造器参数时,我们可以考虑使用构建器Builder模式,相比于重叠构造器模式(定义多个重载的构造函数),JavaBeans模式(通过set方法挨个构造),Builder构建者模式实现的方式更加优雅,对象更利于使用,在保证安全性的同时又兼顾了可读性。  一些著名的框架,比如okhttp, retrofit,安卓中各种原生的组件,比如dialog等随处可见Builder构建者模式。 接...

虎皮青椒没虎皮 356

我用Builder优雅的实现了对象的创建

使用构造函数直接属性赋值 Java的对象创建大家都知道,当对象创建完之后,我们可以有几种方式给对象的属性赋值。比如在new的时候给属性赋值。像这样: 这样在创建对象时就将属性赋值,的确很方便。但是如果对象的属性很多,我们这么赋值就很不优雅了。 使用setter属性赋值 一般我们实际开发中,实体类会有很多属性。这时我们可以使用setter方法给属性赋值,如下代码: 我们一般也是这么写的,但是看到这么多的setter容易眼花,可能写着写着漏掉了一些字段。用户就很有可能拿到不完整的对象。 使用

wujialv的博客 845

使用Builder——优雅的构造对象

一、摘要 当我们需要创建一个复杂的对象时,使用静态工厂或者构造器的方式就显得特别笨拙和丑陋,因为它们有个共同的局限性:它们都不能很好地扩展到大量的可选参数,也就是说,灵活性很差。那么,对于这样的类,我们应该如何创建对象呢?本文列举了三种解决办法:重叠构造器模式、JavaBeans模式和Builder模式,并通过具体实例对上述三种方法进行铺垫和对比,从而真正帮助读者理解Builder模式。 二、动机 当我们需要创建一个复杂的对象时,使用静态工厂或者构造器的方式就显得特别笨拙和丑陋,因为它们有个共同的局限

小王博客基地 1315

构建者模式:优雅构建复杂对象的艺术(创建型)

优势说明封装性好​隐藏产品的内部结构和构建过程扩展性强​增加新的具体构建者很容易,符合开闭原则精细控制​可以精细控制构建过程,逐步构建复杂对象代码可读性​链式调用让代码更加清晰易懂参数校验​可以在 build() 方法中进行集中参数校验构建者模式通过分步构建和链式调用,完美解决了复杂对象的创建问题。它让代码更加:✅可读:清晰的构建步骤✅灵活:支持多种配置组合✅安全:参数校验和不可变对象✅可维护:构建逻辑集中管理。

滴水穿石,不断积累! 329

构建者设计模式

对象如何创建?方式有很多,比如以下方式//无参构造,属性赋值member.setName("花开小世界");//有参构造Member member1 = new Member("13312341234","花开小世界",1);对比以上方式,也可以选择更加优雅的方式书写,比如以下代码,也是创建对象,并且赋值.name("花开小世界").gender(1).build();在很多框架中也能看到这样写的身影。这种编写的方式就是构建者设计模式,好处是易于扩展,方便类的使用。

susjj663的博客 267

从Builder模式看Android弹窗设计的优雅演进

本文探讨了Android弹窗设计的演进历程,重点分析了Builder模式如何通过链式调用解决传统构造方式的局限性,并展示了AlertDialog.Builder的实践应用。文章还介绍了Kotlin DSL等现代技术如何进一步提升弹窗代码的简洁性和可维护性,为开发者提供优雅的弹窗设计解决方案。

quiet的专栏 601

优雅的Builder模式代码

优雅的Builder模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 @Data public class SearchColumn { private List<Column> columns; public SearchColumn(List<Column&gt

王鹏鹏-软件研发工程师 392

建造者模式Builder——优雅的使用姿势

Builder 模式是一种创建型设计模式,主要用于构造具有多个可选参数或复杂结构的对象。其核心思想是通过一个 Builder 类一步步设置对象的属性,最后构造出一个完整的对象。@Builder与设计模式Builder 模式非常适合构造复杂对象或不可变对象。Lombok 的@Builder大幅简化了 Builder 模式的实现,让开发者专注于业务逻辑。

秋元的博客 1941

1、使用责任链+ Builder模式优雅的校验参数

项目中参数校验十分重要,它可以保护我们应用程序的安全性和合法性。@Override这么做最大的优势就是简单直接,但是如果验证逻辑很复杂,比如excel导入数据每个字段值都需要校验,这会导致这个类变得很庞大,而且上面是通过抛出异常来改变代码执行流程,这也是一种不推荐的做法。那么有什么更好的参数校验的方式呢?本文就推荐一种通过责任链设计模式来优雅地实现参数的校验功能,我们通过一个用户注册的例子来讲明白如何实现。有效的注册数据——名字、姓氏、电子邮件、用户名和密码。用户名必须是唯一的。

zht245648124的博客 1233
上一篇: RocketMQ的windos/linux/docker超详细安装及简单入门!
下一篇: 如何优雅地统一管理项目的线程池
Poldroc
博客等级 码龄4年 32粉丝 8原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Poldroc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值