现在的位置: 首页 > 综合 > 正文

第二条:遇到多个构造参数时要考虑用构建器

2013年08月15日 ⁄ 综合 ⁄ 共 1708字 ⁄ 字号 评论关闭
public class _2_2_NutritionFacts {
	
	private final int servingSize;
	private final int serving;
	private final int calories;
	private final int fat;
	private final int sodium;
	private final int carbohydrate;
	private  _2_2_NutritionFacts(Builder builder) {
		this.servingSize  = builder.servingSize;
		this.serving = builder.serving;
		this.calories = builder.calories;
		this.fat = builder.fat;
		this.sodium = builder.sodium;
		this.carbohydrate = builder.carbohydrate;
	}
	public static class Builder{		// 构建器的建立,与原类具有相同的域,通过构建器构建的对象再赋值给原来的对象
		private final int servingSize; // 静态内部类不能引用外部类的成员或方法
		private final int serving;
		private int calories;
		private int fat;
		private int sodium;
		private int carbohydrate;
		public Builder(int servingSize,int  serving) {
			this.servingSize = servingSize;
			this.serving = serving;
		}
		public Builder calories(int calories) { // 每个域的修改都是返回一个Builder,最后再用这个Builder来创建对象
			this.calories = calories;
			return this;
		}
		public Builder fat(int fat) {
			this.fat = fat;
			return this;
		}
		public Builder sodium(int sodium) {
			this.sodium = sodium;
			return this;
		}
		public Builder carbohydrate(int carbohydrate) {
			this.carbohydrate = carbohydrate;
			return this;
		}
		public _2_2_NutritionFacts biuld() {
			return new _2_2_NutritionFacts(this);
		}
	}

	public static void main(String args[]) {
		
		_2_2_NutritionFacts food = new _2_2_NutritionFacts.Builder(20, 100).calories(100).carbohydrate(100).fat(100).sodium(100).biuld();
	}
}
/*
 *		Builder 模式:
 *			利用Builder 构建器创建对象,适合参数较多的对象的构造
		构造一个Builder构建器,其属性拥有和要构建的对象有相同的成员
		在构建器里面为构建器里的每个成员都定义一个修改的方法,并且返回这个构建器
				public Builder fat(int fat){this.fat = fat;return this;}
		然后再定义一个builder 方法,返回要构建的对象
				public _2_2_NutritionFacts build(){
					retunr new _2_2_NutritionFacts(this)
				}
		因为我们在build 方法里面要创建一个以builder 为参数的构造方法,所以要定义一个构造,因只在内部使用,应私有
			private _2_2_NutritionFacts(Builder builder){} 然后将Builder里面的所有成员都赋值给 _2_2_NutritionFacts 的成员
		然后我们生成对象的时候就可以调用
		new _2_2_NutritionFacts.Builder().a(3).b(23).build();
*/

抱歉!评论已关闭.