建造者模式
建造者模式,别名 Builder 模式、构建者模式、生成器吗模式。
类型:创建型设计模式
解决的问题:
- 解决构造器参数列表过长问题
- 解决使用构造器 + setter 方法,无法进行参数依赖关系校验问题
- 解决使用构造器 + setter 方法,对象存在中间状态问题
- 解决使用构造器 + setter 方法,无法实现不可变对象问题
实现细节:
- 将构造器设置成私有,保证只能通过建造者构建对象
- 在构建时集中对参数的依赖关系进行校验
建造者模式实现:
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;
}
// ResourcePoolConfig's getter
public static class Builder {
private static final int DEFAULT_MAX_TOTAL = 8;
private static final int DEFAULT_MAX_IDLE = 8;
private static final int DEFAULT_MIN_IDLE = 0;
private String name;
private int maxTotal = DEFAULT_MAX_TOTAL;
private int maxIdle = DEFAULT_MAX_IDLE;
private int minIdle = DEFAULT_MIN_IDLE;
public ResourcePoolConfig build() {
if (StringUtils.isBlank(name)) {
throw new IllegalArgumentException("资源池名称不能为空");
}
if (maxTotal < 0) {
throw new IllegalArgumentException("资源池最大总量不能小于 0");
}
if (maxIdle < 0) {
throw new IllegalArgumentException("资源池最大空闲量不能小于 0");
}
if (minIdle < 0) {
throw new IllegalArgumentException("资源池最小空闲量不能小于 0");
}
if (maxIdle > maxTotal || minIdle > maxTotal) {
throw new IllegalArgumentException("资源池最大空闲量或最小空闲量不能大于总量");
}
if (minIdle > maxTotal) {
throw new IllegalArgumentException("资源池最小空闲量不能大于最大空闲量");
}
return new ResourcePoolConfig(this);
}
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setMaxTotal(int maxTotal) {
this.maxTotal = maxTotal;
return this;
}
public Builder setMaxIdle(int maxIdle) {
this.maxIdle = maxIdle;
return this;
}
public Builder setMinIdle(int minIdle) {
this.minIdle = minIdle;
return this;
}
}
}
建造者模式使用:
ResourcePoolConfig resourcePoolConfig = new ResourcePoolConfig.Builder()
.setName("MyResourcePoolConfig")
.setMaxTotal(10)
.setMaxIdle(4)
.setMinIdle(2)
.build();
参阅:
- 设计模式之美 - 王争