首页 > 其他分享 >建造者模式的理论与实现

建造者模式的理论与实现

时间:2023-08-13 14:23:19浏览次数:39  
标签:name int 理论 建造 private 模式 maxTotal Builder minIdle

本文实践代码仓库:https://github.com/goSilver/my_practice

目录

一、定义

建造者模式是一种创建复杂对象的设计模式。它将一个复杂对象的构建过程分解为多个简单的步骤,并且允许按照特定的顺序来构建对象。通过使用建造者模式,我们可以将对象的构建算法与表示分离,从而可以使用相同的构建过程来创建不同的表示。通过使用建造者模式,我们可以更加灵活地构建复杂对象,同时也可以避免构造方法的参数过多和构造方法的复杂性。

二、作用

  1. 避免目标对象构造函数的参数列表过多,影响代码的可读性和可维护性;
  2. 解决参数之间存在依赖关系时的校验逻辑;
  3. 避免目标对象暴露set()方法,保证对象不可变;
  4. 避免目标对象存在中间无效状态。

三、实现

创建一个Builder类专门用于对象的创建,先创建建造者,并且通过 set() 方法设置建造者的变量值,然后在使用 build() 方法真正创建对象之前,做集中的校验,校验通过之后才会创建对象。

此处定义一个ResourcePoolConfig连接池资源类,并为它再定义一个Builder类,由Builder类提供set()方法,和包含复杂校验逻辑的build()方法。

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;
    }
    //...省略getter方法...

    /**
     * 我们将Builder类设计成了ResourcePoolConfig的内部类。
     * 我们也可以将Builder类设计成独立的非内部类ResourcePoolConfigBuilder。
     */
    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 (StrUtil.isBlank(name)) {
                throw new IllegalArgumentException("name should not be empty.");
            }
            if (maxIdle > maxTotal) {
                throw new IllegalArgumentException("maxIdle > maxTotal");
            }
            if (minIdle > maxTotal || minIdle > maxIdle) {
                throw new IllegalArgumentException("minIdle > maxTotal or minIdle > maxIdle");
            }

            return new ResourcePoolConfig(this);
        }

        public Builder setName(String name) {
            if (StrUtil.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;
        }
    }
}

四、总结

  1. 和工厂模式有何区别?

工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。

网上有一个经典的例子很好地解释了两者的区别。

顾客走进一家餐馆点餐,我们利用工厂模式,根据用户不同的选择,来制作不同的食物,比如披萨、汉堡、沙拉。对于披萨来说,用户又有各种配料可以定制,比如奶酪、西红柿、起司,我们通过建造者模式根据用户选择的不同配料来制作披萨。

  1. 弊端

使用建造者模式来构建对象,目标对象的成员变量需要在Builder类中重新定义一遍。

标签:name,int,理论,建造,private,模式,maxTotal,Builder,minIdle
From: https://www.cnblogs.com/csh24/p/17626515.html

相关文章

  • 工厂模式的理论与实践
    本文实践代码仓库:https://github.com/goSilver/my_practice目录一、定义二、作用三、实现3.1简单工厂3.2工厂方法3.3简单工厂和工厂方法如何选择?3.4抽象工厂四、总结一、定义工厂模式是一种创建对象的设计模式。它提供了一种统一的接口来创建对象,而不需要直接使用构造函......
  • 不得不懂的技能——混合模式
    构造出一种烟雾缭绕的噶秘诀点这个按钮打开混合模式模式选择屏幕,就是滤色效果如果有一种灰蒙蒙的感觉复制一个副本,混合模式柔光如果觉得过度了,把不透明度降下来就好了......
  • 单例模式的理论与实现
    本文实践代码仓库:https://github.com/goSilver/my_practice目录一、定义二、作用三、实现3.1饿汉式3.2懒汉式3.3双重检查3.4静态内部类3.5枚举四、总结4.1单例存在哪些问题?4.2单例有什么替代解决方案?一、定义单例模式是一种创建型设计模式,它确保一个类只有一个实例,并......
  • 模式匹配
    第14章模式匹配模式匹配是检查某个值(value)是否匹配某一个模式的机制,一个成功的匹配同时会将匹配值解构为其组成部分。它是Java中的switch语句的升级版,同样可以用于替代一系列的if/else语句。模式匹配有点像一个别致的switch声明,它可以侵入到表达式数据结构内部,对这个结构进行......
  • 多变量信息理论
    多变量信息理论是一种用于研究多个变量之间相互作用的方法。它可以帮助理解多个变量之间的关系,包括相关性、依赖性和交互作用等方面。以下是多变量信息理论的一些基本概念和应用:1.熵:熵是信息理论中的一个基本概念,用于衡量随机变量的不确定性。在多变量信息理论中,可以使用条件熵......
  • 完全背包理论基础
    完全背包跟01背包的代码区别就是在第二层背包的遍历的时候是正序的!先遍历物品还是背包是一样的//先遍历物品,再遍历背包privatestaticvoidtestCompletePack(){int[]weight={1,3,4};int[]value={15,20,30};intbagWeight=4;int[]dp=newint[b......
  • 【Java】智慧工地源码-支持私有化部署,SaaS模式+全套硬件设备
    智慧工地硬件设备包括:AI识别一体机、智能广播音响、标养箱、塔机黑匣子、升降机黑匣子、吊钩追踪控制设备、扬尘监测设备、喷淋设备。1.什么是AI危险源识别AI危险源识别是指基于智能视频分析技术,对视频图像信息进行自动分析识别,以实时监测危险区域的人员闯入、靠近等危险行为,从......
  • 11 外观模式 -- go语言设计模式
    外观模式又称为门面模式,它是一种结构型模式。引入外观模式后调用方与多个子系统的通信必须通过一个统一的外观对象进行,外观模式为子系统中的功能接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这些子系统更加容易使用。外观模式的实现代码packagemainimport"......
  • 简单工厂模式
     目录前言导语代码部分总结前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语简单工厂模式编辑......
  • CAP 理论
    CAP理论基本概念维基百科的翻译版本在理论计算机科学中,CAP定理(CAPtheorem),又被称作布鲁尔定理(Brewer’stheorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:一致性(Consistency):等同于所有节点访问同一份最新的数据副本;可用性(Availability):每次请求......