其他分享
首页 > 其他分享> > 【设计模式】建造者模式

【设计模式】建造者模式

作者:互联网

Builder 模式,又叫建造者模式、构建者模式或生成器模式。

概述

当要设置属性的属性时,我们既可以通过构造函数设置,也可以通过 set() 方法设置。

建造者模式解决的问题:

实现细节:

代码实现

建造者模式实现:

/**
 * 资源池配置类
 * */
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;
    }

    public String getName() {
        return name;
    }

    public int getMaxTotal() {
        return maxTotal;
    }

    public int getMaxIdle() {
        return maxIdle;
    }

    public int getMinIdle() {
        return minIdle;
    }

    public static class Builder {
        private String name;
        private int maxTotal = DEFAULT_MAX_TOTAL;
        private int maxIdle = DEFAULT_MAX_IDLE;
        private int minIdle = DEFAULT_MIN_IDLE;

        private static final int DEFAULT_MAX_TOTAL = 8;
        private static final int DEFAULT_MAX_IDLE = 4;
        private static final int DEFAULT_MIN_IDLE = 2;

        public ResourcePoolConfig build() {
            if (StringUtils.isBlank(name)) {
                throw new IllegalArgumentException("资源池名称不能为空");
            }
            if (maxIdle > maxTotal) {
                throw new IllegalArgumentException("最大空闲线程数不能大于最大线程数");
            }
            if (minIdle > maxIdle) {
                throw new IllegalArgumentException("最小空闲线程不能大于最大空闲线程数");
            }
            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("最大线程数必须大于 0");
            }
            this.maxTotal = maxTotal;
            return this;
        }

        public Builder setMaxIdle(int maxIdle) {
            if (maxIdle < 0) {
                throw new IllegalArgumentException("最大空闲线程数必须大于等于 0");
            }
            this.maxIdle = maxIdle;
            return this;
        }

        public Builder setMinIdle(int minIdle) {
            if (minIdle < 0) {
                throw new IllegalArgumentException("最小空闲线程数必须大于等于 0");
            }
            this.minIdle = minIdle;
            return this;
        }
    }
}

建造者模式使用:

ResourcePoolConfig resourcePoolConfig = new ResourcePoolConfig.Builder()
        .setName("test")
        .setMaxTotal(32)
        .setMaxIdle(8)
        .setMinIdle(4)
        .build();

参阅

标签:name,int,建造,private,线程,模式,maxTotal,设计模式,public
来源: https://www.cnblogs.com/liaozibo/p/builder.html