【设计模式】建造者模式
作者:互联网
Builder 模式,又叫建造者模式、构建者模式或生成器模式。
概述
当要设置属性的属性时,我们既可以通过构造函数设置,也可以通过 set()
方法设置。
建造者模式解决的问题:
- 简化构造函数的参数列表
- 当构造参数存在制约关系时,建造者模式可以在
build()
方法进行校验 - 当对象是不可变时,建造者模式可以避免暴露
set()
方法 - 避免创建对象时存在中间状态
实现细节:
- 将对象的构造器设置成私有的
- 新增一个静态内部类,封装创建过程
代码实现
建造者模式实现:
/**
* 资源池配置类
* */
public class ResourcePoolConfig {
private String name; // 资源池名称(必填)
private int maxTotal; // 最大线程数(非必填)
private int maxIdle; // 最大空闲线程数(非必填)
private int minIdle; // 最小空闲线程数(非必填)
// 将构造器设置成私有,避免外部调用
private ResourcePoolConfig(Builder builder) {
name = builder.name;
maxTotal = builder.maxTotal;
maxIdle = builder.maxIdle;
minIdle = builder.minIdle;
}
public String getName() {
return name;
}
public int getMaxTotal() {
return maxTotal;
}
public int getMaxIdle() {
return maxIdle;
}
public int getMinIdle() {
return minIdle;
}
public static class Builder {
private String name;
private int maxTotal = DEFAULT_MAX_TOTAL;
private int maxIdle = DEFAULT_MAX_IDLE;
private int minIdle = DEFAULT_MIN_IDLE;
private static final int DEFAULT_MAX_TOTAL = 8;
private static final int DEFAULT_MAX_IDLE = 4;
private static final int DEFAULT_MIN_IDLE = 2;
public ResourcePoolConfig build() {
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("资源池名称不能为空");
}
if (maxIdle > maxTotal) {
throw new IllegalArgumentException("最大空闲线程数不能大于最大线程数");
}
if (minIdle > maxIdle) {
throw new IllegalArgumentException("最小空闲线程不能大于最大空闲线程数");
}
return new ResourcePoolConfig(this);
}
public Builder setName(String name) {
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("资源池名称不能为空");
}
this.name = name;
return this;
}
public Builder setMaxTotal(int maxTotal) {
if (maxTotal <= 0) {
throw new IllegalArgumentException("最大线程数必须大于 0");
}
this.maxTotal = maxTotal;
return this;
}
public Builder setMaxIdle(int maxIdle) {
if (maxIdle < 0) {
throw new IllegalArgumentException("最大空闲线程数必须大于等于 0");
}
this.maxIdle = maxIdle;
return this;
}
public Builder setMinIdle(int minIdle) {
if (minIdle < 0) {
throw new IllegalArgumentException("最小空闲线程数必须大于等于 0");
}
this.minIdle = minIdle;
return this;
}
}
}
建造者模式使用:
ResourcePoolConfig resourcePoolConfig = new ResourcePoolConfig.Builder()
.setName("test")
.setMaxTotal(32)
.setMaxIdle(8)
.setMinIdle(4)
.build();
参阅
标签:name,int,建造,private,线程,模式,maxTotal,设计模式,public 来源: https://www.cnblogs.com/liaozibo/p/builder.html