侧边栏壁纸
博主头像
qingtian博主等级

喜欢是一件细水流长的事,是永不疲惫的双向奔赴~!

  • 累计撰写 94 篇文章
  • 累计创建 42 个标签
  • 累计收到 1 条评论

再谈建造者模式

qingtian
2022-04-04 / 0 评论 / 1 点赞 / 207 阅读 / 1,992 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-04,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

建造者模式

建造者模式,Builder 模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式。

何时使用建造者模式

在平时的开发中,创建一个对象最常用的方式是,使用 new 关键字调用类的构造函数来完成。

我们虽然可以通过将必填配置项都放在构造函数中设置,那构造函数就会出现参数列表很长的问题。如果我们把比必填项也通过set()方法设置,那校验参数的逻辑就无处安放了。

除此之外,假设配置项之间有一定的依赖关系,比如,如果用户设置了 maxTotal、maxIdle、minIdle 其中一个,就必须显式地设置另外两个;或者配置项之间有一定的约
束条件,比如,maxIdle 和 minIdle 要小于等于 maxTotal。如果我们继续使用现在的设计思路,那这些配置项之间的依赖关系或者约束条件的校验逻辑就无处安放了。

如果我们希望 ResourcePoolConfig 类对象是不可变对象,也就是说,对象在创建好之
后,就不能再修改内部的属性值。要实现这个功能,我们就不能在ResourcePoolConfig 类中暴露 set() 方法。

下面是使用建造者模式的代码实例:

public class ResourcePoolConfig {
    private String name;
    private int maxTotal;
    private int maxIdle;
    private int minIdle;

    private ResourcePoolConfig(Builder builder) {

    }

    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 RuntimeException();
            }
            if (maxIdle > maxTotal) {
                throw new RuntimeException();
            }
            if (minIdle > maxTotal || minIdle > maxIdle) {
                throw new RuntimeException();
            }
            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();
            }
            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;
        }

    }

    public static void main(String[] args) {
        ResourcePoolConfig config = new ResourcePoolConfig.Builder()
                .setName("guank")
                .setMaxTotal(16)
                .setMaxIdle(10)
                .setMinIdle(12)
                .build();
    }
}

建造者模式和工厂模式的区别

建造者模式是让建造者来负责对象的创建工作。工厂模式是使用工厂类来负责对象的创建工作。

实际上,工厂模式是用来创建不同但是是相关类型的对象(继承自同一个父类或是接口的一组子类),用给定的参数来确定创建对象的类型。建造者模式是用来创建一种类型的复杂对象,通过建造者类可以将复杂的内部参数判断逻辑,定制化的创建一种对象。

0

评论区