ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【设计模式】建造者模式

2022-06-13 00:00:09  阅读:154  来源: 互联网

标签:name int 建造 private 线程 模式 maxTotal 设计模式 public


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

概述

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

建造者模式解决的问题:

  • 简化构造函数的参数列表
  • 当构造参数存在制约关系时,建造者模式可以在 build() 方法进行校验
  • 当对象是不可变时,建造者模式可以避免暴露 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有