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 ,原书有更加详细的解释,推荐读者去购买正版并阅读学习,特此说明
当面对多个构造器参数时,Java中Builder模式提供了一种优雅的解决方案。它通过步骤式的构建过程,避免了重叠构造器的复杂性和JavaBeans模式的调试难题。Builder模式确保线程安全,支持灵活构建多个对象,并且使代码更易于阅读。推荐在构造器或静态工厂有多个参数时使用。
765

被折叠的 条评论
为什么被折叠?



