前言

Builder 设计模式也叫做 构建者模式或者建造者模式,名字只是一种叫法,当聊起三种名称的时候知道是怎么回事就行

Builder 设计模式在作者编码过程中,属于比较常用的模式之一。优秀的设计模式总是会受到广大开发者的青睐,Hutool 也是其中之一

因为上周编写的业务需要用到线程池,就去 Hutool thread 包下看了看,还真有惊喜,学习到了一种之前编码中没用过的 Builder 模式实现

这里必须提一句:设计模式重要的是思想,一种设计模式可能不止一种实现方式

Builder 模式文章大纲如下:

  1. Builder 模式应用场景

  2. Hutool 线程池如何应用 Builder 模式

  3. Builder 模式不同的实现方式

  4. Builder 模式总结

Builder 模式应用场景

Builder 模式作用域:如果类的属性之间有一定的依赖关系或者约束条件(源自设计模式之美),那么就可以考虑使用 Builer 设计模式

我们依照线程池来举例,默认创建的线程池,构造方法最多有七个参数,核心线程数、最大线程数、阻塞队列、线程存活时间...

日常使用创建线程池时,大家想一下为什么要这么设计?一起来看下源码注释中如何解释此行为

线程池之所以设置如此之多的构造参数,是因为对这些参数会有一定规则的校验,如果不满足线程池的规则,将不允许创建线程池,通过抛异常的方式终止程序

终止规则大概有七点,这里列举一下:

  1. 核心线程数不可以小于 0

  2. 线程存活时间不可以小于 0

  3. 最大线程数不可以小于等于 0,同时也不可以小于核心线程数

  4. 阻塞队列、线程工厂、拒绝策略参数均不可为空

上述七点有两个作用,其一是为了让核心参数满足线程池运行流程,其二是为了保障运行时的稳定性

小伙伴想一哈线程池创建是不是灰常灰常适合 Builder 模式,构造器函数过多以及属性之间存在依赖关系和约束条件

Hutool Builder 创建线程池

Hutool 线程池相关使用 Builder 设计模式有两处,一个是创建线程池,另一个是创建线程工厂,我们重点围绕线程池说

创建 Hutool 线程池比较简单且优雅,笔者较喜欢这种链式风格,所以抽象公共业务时都会使用此模式,如图所示

这个时候跟下源码,先从 ExecutorBuilder#create 入手,小伙伴就明白 Hutool 是如何玩 Builder 模式了

public static ExecutorBuilder create() {return new ExecutorBuilder();
}

What?自己创建自己?这是要搞啥子

小伙伴想一下,如果你想要对一个类中属性进行约束,前提是不是先应该把属性搞到手

没错,ExecutorBuilder#create 方法返回自己本身,然后通过 set 方法 把数据填充到创建出来的对象上,最后再进行依赖关系整理和条件约束

看一下 ExecutorBuilder#build 方法内部做了什么事情

这里有个知识点,也是B格之一,大家看到 build 方法上有 @Override 注解,证明它是实现了接口方法

Hutool 定义了 Builder 接口,实现此接口即可完成 Builder 模式,泛型 T 代表需要返回的构造对象类型,比如刚才线程池 Builder 泛型就是 ThreadPoolExecutor

在实现 build 方法上调用真正管理依赖和约束的方法 build(ExecutorBuilder builder),将刚才创建好并且已经赋过值的构建对象传入

最后 build(ExecutorBuilder builder) 返回的就是我们所需要的线程池对象,这一块大家可以自己跟下源码,学会就可以套用自己写的业务代码

Hutool Version:5.0.6

源码包路径:cn.hutool.core.thread

Builder 模式不同的实现方式

上文说过,设计模式重思想,就像 Builder 模式,强调的是 管理依赖关系或者约束条件

刚才 Hutool Builder 只是一种实现方式,之前还用过静态内部类的实现方式

代码经过精剪,并且为了阅读体验感,把部分缩进去除了。不过笔者测试过粘贴到 IDEA 中编译是可以的

@Getter
public class HttpParameters {private Builder builder;public static Builder newBuilder() { return new Builder(); }private HttpParameters(Builder builder) { this.builder = builder; }@Getterpublic 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() {if (StringUtils.isBlank(url)) {throw new RuntimeException("URL不允许为空 "); }// ...return new HttpParameters(this);}}
}

如果后面要获取 HttpParameters 参数就需要先获取 Builder 对象

可能有些小伙伴不习惯这种方式,也可以把 Builder 对象属性在 Parameters 里也定义一份,方式都很灵活

结言

本文通过创建线程池为引,讲述了 Builder 设计模式的场景以及实际用途,并引用 Hutool Builder 模式创建线程池进行讲解。相信大家看完之后对 Builder 模式的场景以及应用有了更深入的了解,另外我们可以将 Builder 模式引入到自己代码中,实际操练一下,相信你也会对它 "爱不释手"

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

火遍全网的Hutool,如何使用Builder模式构建线程池相关推荐

  1. 苹果经典提示音_火遍全网的iPhone提示音,你知道怎么设置吗?

    火遍全网的iPhone提示音,你知道怎么设置吗? 简单阐述: "今天的不开心就止于此吧,明天依旧光芒万丈啊宝贝"这是动画片<海绵宝宝>的一句经典台词, 也可以是你的iP ...

  2. 一夜之间,「AI孙燕姿」火遍全网!

    来源:新智元 一夜之间,「AI孙燕姿」火遍全网. B站上,AI孙燕姿翻唱的林俊杰「她说」.周董「爱在西元前」.赵雷「成都」等等,让一众网友深陷无法自拔. 「冷门歌手」孙燕姿新晋成为2023年度热门歌手 ...

  3. 用计算机弹歌说散就散,2018开年最红的4首歌:等你下课垫底,说散就散第2,第1火遍全网...

    2018开年最红的4首歌:等你下课垫底,说散就散第2,第1火遍全网 4.等你下课 2018年1月18日,周杰伦发表新单曲<等你下课>.这首歌来自周杰伦发想的一个故事,想象一个年轻人暗恋一个 ...

  4. 火遍全网的杠精哥配音怎么制作?

    火遍全网的杠精哥配音怎么制作?搞怪配杠精哥配音制作教程来啦 沙雕动画配音大家都看过吧?盘点这些搞笑视频爆品,这些沙雕的剧情,独特的声音,使观众看完,要么是捧腹大笑,要么是一脸懵逼怀疑人生.其中最有特色 ...

  5. 利用建造者(Builder)模式构建 Java 对象

    简介: 一般我们构建对象有两种方法,一是构造器,二是默认无参构造器创建对象后使用 set 方法一个个赋值.第一种方法我们需要写一个全参的构造方法,但这样我们在构造对象时有一些不需要填写的对象也要给他赋 ...

  6. 火遍全网,却被广东人嫌弃!昔日“百亿网红”,快被打回原形了

    本文来源|金错刀 ID|ijincuodao 作者|祥燎 2018年高喊"活下去",2021年提倡"节衣缩食",2022年又说要"背水一战" ...

  7. 火遍全网的 “神注释”,看一次笑一次!

    某站后端代码被"开源",同时刷遍全网的,还有代码里的那些神注释. 我们这才知道,原来程序员个个都是段子手:这么多年来,我们也走过了他们的无数套路...... 首先,产品经理,是永远 ...

  8. C/C++项目:火遍全网的字符动画到底如何制作呢?(内附源码)

    字符动画,顾名思义就是由字符组成的动画. 如果你经常刷短视频的话,相信你一定刷到过某音创作者将女神井川里予跳舞视频制作成字符动画,点赞也能破10W. 那么,火遍某音的字符动画用编程语言怎么制作呢?感兴 ...

  9. JAVA Builder模式构建MAP/LIST的示例

    我们在构建一个MAP时,要不停的调用put,有时候看着觉得很麻烦,刚好,看了下builder模式,觉得这思路不错,于是乎,照着用builder模式写了一个构建MAP的示例,代码如下: import j ...

最新文章

  1. 机器学习实战-数据探索(变量变换、生成)
  2. 编解码再进化:Ali266与下一代视频技术
  3. P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)
  4. CNN发展历史【从LeNet到DenseNet】
  5. 【TensorFlow】TensorFlow函数精讲之 tf.random_normal()
  6. python 迭代器 生成器_Python迭代器和生成器
  7. android 蓝牙通信编程
  8. C#winform实现下载文件的功能
  9. ISO20000对高校构建IT服务管理体系的应用价值和实践意义
  10. Python开发基础(一)基本数据类型
  11. 主流Paas云平台架构设计思想
  12. 如何应对网站流量暴增
  13. 想知道美国大学按计算机专业的排名,以及各大学在计算机哪个方面是强项,应该去哪里查找?...
  14. Crypto++编译使用
  15. leo-校园收费管理系统
  16. c语言字母加单引号和不加,C语言单引号和双引号的区别
  17. 长江后浪推前浪,UnityWebRequest替代WWW
  18. 编写一个求和函数sum,用于计算 1+2+.......+n ,在主函数调用该函数求和。
  19. 视频mkv格式怎么转换成mp4,简单实用的步骤
  20. 武科大C语言历年试卷,2021武汉科技大学考研历年真题

热门文章

  1. 乐高无限无法连接到服务器,乐高无限近期热点问题FQ 新手问题解答
  2. html中文字描边效果代码,css如何设置文字描边效果?
  3. cv mat保存图片_(七)神秘的Mat
  4. php如何使用正则表达式,php如何使用正则表达式实现替换
  5. fedora 编译安装mysql_Fedora 下编译安装安装基于Lighttpd+PHP5+MySQL5
  6. mac 无法启动linux系统安装,苹果官方技术文档显示新款Mac Mini不能安装Linux系统...
  7. hashcat 基本使用
  8. 3-2:HTTP协议之URI(URL)和HTTP基本概念及其特征
  9. poj3616 基础的动态规划算法 《挑战程序设计竞赛》
  10. java中发红包案例之红包界面不出来的解决方案