设计模式之建造者模式Builder
java宝典
共 7079字,需浏览 15分钟
· 2021-06-26
建造者模式:
创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。通俗的讲就是 创建可装配的复杂对象
建造者模式,属于创建类型
实际代码我放在了Github: https://github.com/liangtengyu/DesignPatterns-for-Java
应用场景:
学习一个设计模式之前 我们先了解它的使用场景能够帮我们更快的理解它,实现方式:
当使用new()时 参数过多容易导致混乱和BUG的产生
使用set方法赋值时 会创建一个可变对象,即对象创建完后还可以使用set方法改变变量,此时应该使用builer 使用new关键字创建对象时,对于入参的校验比较混乱 使用set方法时,对于入参的校验比较分散,不容易集中管理 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。 使用Builder的好处
将入参的校验逻辑都封装到build()方法中,进行统一的处理,处理完成才创建对象,否则不创建对象,方便管理校验逻辑 使用build方法创建对象后,对象无法通过set方法进行修改参数,保证了对象的不可变
实现方式:
例:
public class ResourceConfig {
private String name;
private int maxTotal;
private int maxIdle;
private int minIdle;
private ResourceConfig(ResourceConfigBuilder builder) {
this.name = builder.name;//使用static 内部类可以直接拿属性
this.maxTotal = builder.getMaxTotal();//也可以通过get方法获取
this.maxIdle = builder.getMaxIdle();
this.minIdle = builder.getMinIdle();
}
public String getName() {
return name;
}
public int getMaxTotal() {
return maxTotal;
}
public int getMaxIdle() {
return maxIdle;
}
public int getMinIdle() {
return minIdle;
}
@Override
public String toString() {
return "ResourceConfig{" +
"name='" + name + '\'' +
", maxTotal=" + maxTotal +
", maxIdle=" + maxIdle +
", minIdle=" + minIdle +
'}';
}
public static class ResourceConfigBuilder {
private static final int DEF_MAX_TOTAL = 8 ;
private static final int DEF_MAX_IDLE=0;
private static final int DEF_MIN_IDLE=0;
private String name;
private int maxTotal=DEF_MAX_TOTAL;
private int maxIdle = DEF_MAX_IDLE;
private int minIdle = DEF_MIN_IDLE;
public ResourceConfigBuilder setName(String name) {
this.name = name;
return this;//返回this 能够实现链式调用
}
public ResourceConfigBuilder setMaxTotal(int maxTotal) {
this.maxTotal = maxTotal;
return this;
}
public ResourceConfigBuilder setMaxIdle(int maxIdle) {
this.maxIdle = maxIdle;
return this;
}
public ResourceConfigBuilder setMinIdle(int minIdle) {
this.minIdle = minIdle;
return this;
}
public String getName() {
return name;
}
public int getMaxTotal() {
return maxTotal;
}
public int getMaxIdle() {
return maxIdle;
}
public int getMinIdle() {
return minIdle;
}
public ResourceConfig build(){
//校验逻辑放到build()方法之前,先校验 再 创建
if (minIdle > maxTotal) {
throw new IllegalArgumentException("无效的参数, cause : minIdle > maxTotal");
}
return new ResourceConfig(this);
}
}
}
总结-抽象理解
创建对象我们可以通过工厂方法和builder
工厂方法相当于对同类工厂抽象,如:披萨 汉堡 同是KFC的产品. 定向生产这2种产品工厂,披萨工厂 汉堡工厂
Builder相当于对于一种类的创建过程繁琐的抽象,如 披萨 我们在创建过程中想用什么肉类,什么蔬菜,甜还是咸,创建之前统一进行处理,到最终创建完成
评论
微服务与领域驱动设计,架构实践总结
来源:知了一笑👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接:http://116.62.199.48/ ,新
小哈学Java
0
面试官:电商库存扣减如何设计?如何防止超卖?
来源:my.oschina.net/xiaolyuh/blog/1615639👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示
小哈学Java
0
即将登陆,Win11的新功能:手机当摄像头、省电模式升级
近日,微软为其Windows 11操作系统推出了一次相对较小的功能更新“Moment 5”,但更多的激动人心的变化将在2024年下半年随着24H2版本的发布而揭晓。尽管完整的更新列表尚未公布,但一系列即将加入的新功能已经引起了广泛关注。引人注目的功能之一是,Windows 11将支持将手机作为无线网
Python 知识大全
3
公司新来一个同事,把风控系统设计得炉火纯青,万能通用,稳的一批!
点击关注公众号,Java 干货及时推送↓推荐阅读:铜三铁四,怒拿 35K * 14 薪!作者:wingli链接:https://juejin.cn/post/7182774381448282172一、背景1.为什么要做风控? 这不得拜产品大佬所赐目前我们业务有使用到非常多的AI能力,如oc
Java技术栈
0
带你玩转Linux系统之lscpu命令
链接:https://bbs.huaweicloud.com/blogs/422603一、lscpu命令介绍lscpu 是一个 Linux 命令,用于显示CPU架构的详细信息。它可以用来查看 CPU 的型号、主频、架构、虚拟化支持等。二、lscpu命令的使用帮助2.1 命令格式lscpu [选项]2
良许Linux
0
C语言基础之动态内存操作汇总
来源:机器之心1、堆区空间申请#include <stdlib.h> //头文件void *malloc(size_t size);//函数size表示申请的空间字节数函数的返回值:成功:返回值空间起始地址失败:NULL特点:分配指定大小的内存空间;分配的内存空间是连续的;需要手动释放
良许Linux
0
大模型并行训练指南:通俗理解Megatron-DeepSpeed之模型并行与数据并行(下)
文末《大模型项目开发线上营》秒杀倒计时↓↓↓接前文:(上)篇>>>大模型并行训练指南:通俗理解Megatron-DeepSpeed之模型并行与数据并行(上)(中)篇>>>大模型并行训练指南:通俗理解Megatron-DeepSpeed之模型并行与数据并行(中)06
七月在线实验室
10
【Nucleic Acids Research】利用生成式深度学习模型设计蓝藻细菌的合成启动子
题目:Design of synthetic promoters for cyanobacteria with generative deep-learning model期刊:Nucleic Acids Research影响因子:19.16发表时间:2023.5.29原文作者:Euijin Seo
生信宝典
0