建造者模式定义
建造者模式也叫生成器模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,定制的创建不同的对象
建造者模式的使用场景
如果一个类有很多属性,为了避免构造函数过长,影响代码的可读性和易用性,我们可以通过构造函数配合set()方法来解决。但是是必输字段的话就必须要放入到构造函数中,如果必输字段过多,就会造成构造函数过长,如果是以下几种情况,就需要是用建造者模式
- 如果必输的参数比较多的情况
- 如果类的属性之间存在依赖关系
- 如果我们希望创建不可变对象,就是对象创建完成之后不能再改变其内部属性值
建造者模式案例
/**
* @author yangpengyi
* @create 2020-08-04 16:28
* @description 建造者模式
**/
public class ResourcePoolConfig {
private String name;
private int maxTotal;
private int maxIdle;
private int minIdle;
private ResourcePoolConfig(Builder builder){
this.name = builder.name;
this.maxTotal = builder.maxTotal;
this.maxIdle = builder.maxIdle;
this.minIdle = builder.minIdle;
}
//.....省略setter方法
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(name == null || "".equals(name)){
throw new IllegalArgumentException("name should not be empty.");
}
if(maxIdle > maxTotal){
throw new IllegalArgumentException(".......");
}
if(minIdle > maxTotal || minIdle > maxIdle){
throw new IllegalArgumentException(".......");
}
return new ResourcePoolConfig(this);
}
public Builder setName(String name) {
if (name == null || "".equals(name)) {
throw new IllegalArgumentException("...");
}
this.name = name;
return this;
}
public Builder setMaxTotal(int maxTotal) {
if (maxTotal <= 0) {
throw new IllegalArgumentException("...");
}
this.maxTotal = maxTotal;
return this;
}
public Builder setMaxIdle(int maxIdle) {
if (maxIdle < 0) {
throw new IllegalArgumentException("...");
}
this.maxIdle = maxIdle;
return this;
}
public Builder setMinIdle(int minIdle) {
if (minIdle < 0) {
throw new IllegalArgumentException("...");
}
this.minIdle = minIdle;
return this;
}
}
}
/**
* @author yangpengyi
* @create 2020-08-04 16:42
* @description
**/
public class Main {
public static void main(String[] args) {
ResourcePoolConfig resourcePoolConfig = new ResourcePoolConfig.Builder().setMaxTotal(16)
.setMaxIdle(10)
.setMinIdle(12)
.setName("测试")
.build();
}
}