Java当遇到多个构造器参数时考虑构建器

 一般创建实例的方法

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模式性能开销可能大一些,而且代码量看起来也挺长的,、

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

posted @ 2013-12-09 16:51  曹守鑫  阅读(1245)  评论(1编辑  收藏  举报