首页 > 其他分享 >设计模式之美--建造者模式

设计模式之美--建造者模式

时间:2022-12-23 11:12:33浏览次数:31  
标签:name -- 之美 private int maxTotal new 设计模式 ResourcePoolConfig

建造者模式的作用:创建对象;
为什么要使用创建者模式来创建对象,普通的new对象不可以吗?

  1. 如果使用构造器来创建对象,当参数值的数量过多时,代码中的构造器数量和形式较混乱,并且给构造器中的参数赋值,且参数数量太多。很容易出错,看起来也不是那么清晰;
  2. 如果用无参构造或者有参构造(对一些必填的参数)来new出对象,然后对其他的不必填的参数使用set方法填充。肯定比上面完全使用有参构造器更加简洁清晰;
  3. 如果有个需求 对于创建出来的对象的成员变量有些额外逻辑的限制条件;为了保证创建出来的对象一定是正确有效的对象。可以使用建造者模式;
  4. 当然对于对象中的必填参数可以使用有参构造器来创建,并在构造器里写校验逻辑,但有涉及到第一个问题:必填参数过多呢,参数过乱呢?
  • 总结:构造器创建对象可以有校验逻辑,但是参数多较乱可读性差;使用set方法,简单清晰,但是无法做到必要的参数校验;
  • 建造者模式在创建好对象后,该对象就不能随意修改内部的值(如set方法)
/**
 * 建造器模式demo
 * @author lq
 * @version : ResourcePoolConfig.java, v 0.1 2022年12月23日 10:47 lq Exp $
 */
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;
    }
    // 省略get方法,不暴露set方法,保证创建出来的对象是不可变对象

    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 (maxIdle > maxTotal) {
                throw new IllegalArgumentException("..."); 
            }
            if (minIdle > maxTotal || 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("...");
            }
            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;
        }
    }
    
}
ResourcePoolConfig config = new ResourcePoolConfig.Builder()
                .setName("xxx")
                .setMaxTotal(8)
                .build();

标签:name,--,之美,private,int,maxTotal,new,设计模式,ResourcePoolConfig
From: https://www.cnblogs.com/rbwbear/p/17000183.html

相关文章

  • Educational DP Contest G - Longest Path (dfs+dp)
    https://atcoder.jp/contests/dp/tasks/dp_g题目大意:给定n个点,m条有向边(确定无环),问最长路径是多少?SampleInput1451213322434SampleOutput13#......
  • Dockerfile介绍及常用保留指令
    从本文开始,咱们将介绍docker的另外一个技术点:dockerfile.我们来看看DockerFile相关的知识点,我们将怎么学习?1:DockerFile是什么?2:DockerFile构建过程解析3:常用的保留字指令......
  • Zabbix与乐维监控对比分析(五)——可视化篇
    前面我们详细介绍了Zabbix与乐维监控的架构与性能、Agent管理、自动发现、权限管理、对象管理、告警管理方面的对比分析,相信大家对二者的对比分析有了相对深入的了解,接下来......
  • CSS-层次选择器-2022-12-23
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>/*p{*//*background:#61e93e;*//*}*//*1.后代......
  • 使用JsonConverter处理上传文件的路径
    场景我们上传一个文件,把文件保存到服务器上,会有一个明确的物理路径,由于需要从前端访问这个文件,还需要web服务器中的一个虚拟路径。这个虚拟路径的存储会有一个问题,我们应......
  • 初识C#
    结束了上一个项目,现在开始了新的项目------C#。对于C#可能没接触过的人比较陌生,脑海里出现的可能是,这是个什么东西?干什么用的?为什么要用?等等这些问题,这篇文章,我作为一个初学......
  • 分析建模
    为了更好地理解需求获取过程中用户描述的问题,可以采用创建模型的方式实现。这就是分析建模的过程。模型,就是为了理解事物所做出的一种抽象,是对事物无歧视义......
  • UML总结----六种关系和九种图的作用
    已经学习了UML,应该对UML有一个大概的认识,下面一张图是我画的一个思维导图。从图上可以看出UML可以大致分为视图、事物、关系以及它的9种图。视图在逻辑视图中:逻辑视图通常由......
  • 如何使用VS
    上一篇博客说到IDE,也就是集成开发环境。那么.net的集成开发环境就是vs。下面先介绍一下VS。VS介绍一个程序只有一个主入口,只有一个主方法(main),代码都是在主函数里书写。如图......
  • C#的注释、快捷键、字符和运算
    在写一个程序的时候,一个程序员的基本素质就是一定要写注释,这样老板看你的程序的时候,才不会小看你哦!C#的注释方法三种注释方法:1、单行注释:以“//”开头,后面内容为注释内容2、......