设计模式-建造者模式

183 阅读2分钟

建造者模式定义

建造者模式也叫生成器模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,定制的创建不同的对象

建造者模式的使用场景

如果一个类有很多属性,为了避免构造函数过长,影响代码的可读性和易用性,我们可以通过构造函数配合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();
    }
}