建造者模式

建造者模式,别名 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();

参阅:

  • 设计模式之美 - 王争
posted @ 2022-06-12 23:55  廖子博  阅读(31)  评论(0编辑  收藏  举报