基础-Java构建器/Builder模式入门解析

当面对多个构造器参数时,Java中Builder模式提供了一种优雅的解决方案。它通过步骤式的构建过程,避免了重叠构造器的复杂性和JavaBeans模式的调试难题。Builder模式确保线程安全,支持灵活构建多个对象,并且使代码更易于阅读。推荐在构造器或静态工厂有多个参数时使用。

1、什么情况下考虑使用构造器

  • 遇到多个构造器参数需要设置的时候/可能一次只需要设置其中特定的几项;
  • 这时候使用重叠构造器模式,第一个构造器含一个参数,第二个两个,以此类推。会涉及到用不到的参数,造成失控;
  • 这时候出现了JavaBeans模式,使用一个无参的构造器创建对象,之后使用setter方法设置每个必要的参数(setXxxxx)。缺点是调试困难,线程不安全。

2、Builder模式介绍

  • 1、不直接生成想要的对象,而是让客户端利用必要的参数调用构造器,以此得到一个builde对象;
  • 2、客户端在builder对象上利用类setter的方法,设置相关参数;
  • 3、最后,客户端调用无参的build对象生成不可变的对象。

3、示例代码

package test;

public class NutritionFacts {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    public static class Builder{//静态内部类
        private final int servingSize;
        private final int servings;

        private  int calories = 0;//没有final
        private  int fat = 0;
        private  int sodium = 0;
        private  int carbohydrate = 0;

        public Builder(int servingSize,int servings){//有参构造器
            this.servingSize = servingSize;
            this.servings = servings;
        }

        //setter
        public Builder calories(int val){
            calories = val;
            return this;
        }
        public Builder fat(int val){
            fat = val;
            return this;
        }
        public Builder sodium (int val){
            sodium  = val;
            return this;
        }
        public Builder carbohydrate(int val){
            carbohydrate = val;
            return this;
        }

        public NutritionFacts build(){
            return new NutritionFacts(this);
        }
    }

    private NutritionFacts(Builder builder){
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
}

//测试 客户端代码 这里就直接在此类写了
    public static void main(String[] args){
        NutritionFacts cacaCola = new Builder(240,8).calories(100).sodium(35).carbohydrate(27).build();
    }
}

4、Builder模式优势

  • 1、可以有多个可变的参数;
  • 2、十分灵活,可以用单个builder构造多个对象;
  • 3、使用Builder模式的客户端代码更利于阅读和编写;
  • 4、线程安全;

5、什么时候使用构建器

如果类的构造器或者静态工厂中具有多个参数,推荐使用Builder模式。

部分内容整理自Effective Java ,原书有更加详细的解释,推荐读者去购买正版并阅读学习,特此说明

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值