一般创建实例的方法

1. 构造方法

2.静态工厂方法

3.构建器

当使用构造器或者静态工厂方法时,创建类的实例不能很好的用于大量的可选参数,类似于有的参数是必须的,有个往往要根据可选参数设置默认值,不同的构造方法。

这是我们一般习惯使用的重叠构造器*telecoping constructor模式,

通过使用JavaBean模式,可以改进这种类的构造方法,使用默认的构造方法,设置不同的参数,但是该模式有很大的缺点,因为构造器被分配到不同的构造过程,导致JavaBean可能处于不一致的状态,特别的不适合用于多线程操作,导致类变得可变。

第三中方法通过构建器,Builder模式,不直接生成想要的对象,而是通过让客户端利用所有必要的参数调用构造器,得到一个builder对象,然后客户端在builder对象上调用类似于setter的方法,来设置每个相关的可选参数,最后客户端通过调用无参的builder方法生成不可变对象

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{
		//required parameters
		private final int servingSize;
		private final int servings;
		//optional paramters-initialized to default values;
		private int calories=0;
		private int fat=0;
		private int carbohydrate=0;
		private int sodium=0;
		public Builder(int servingSize,int servings){
			this.servingSize=servingSize;
			this.servings=servings;
		}
		public Builder calories(int val){
			calories=val;
			return this;
		}
		public Builder fat(int val){
			this.fat=val;
			return this;
		}
		public Builder carbohydrate(int val){
			this.carbohydrate=val;
			return this;
		}
		public Builder sodium(int val){
			this.sodium=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 instance=new NutritionFacts.Builder(240, 8).calories(2).build();
	}
}

  Builder模式性能开销可能大一些,而且代码量看起来也挺长的,、

适用于可选参数特别多的情况

相关文章:

  • 2021-12-20
  • 2022-12-23
  • 2021-12-20
  • 2022-02-06
  • 2021-08-18
  • 2022-02-11
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-04-18
  • 2021-12-17
  • 2022-12-23
  • 2021-06-06
相关资源
相似解决方案