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

Condider a builder when faced with many constructor parameters

2013年12月11日 ⁄ 综合 ⁄ 共 3168字 ⁄ 字号 评论关闭

   最近在看Effective Java这本书,感觉写的还可以。只是觉得全英文还是有点难懂(看来我的英文水平还有待提高啊!!!尴尬

   Ttem 2 :(看下面的几段代码,有关设计模式,当然都有有点有缺点)

package EightthWeek;
//Telescoping constructor pattern - does not scale well

public class NutritionFacts1 {

	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 NutritionFacts1(int servingSize, int servings) {
		this(servingSize,servings,0);
	}

	public NutritionFacts1(int servingSize, int servings, int calories) {
		this(servingSize,servings,calories,0);
	}

	public NutritionFacts1(int servingSize, int servings, int calories, int fat) {
		this(servingSize,servings,calories,fat,0);
	}

	public NutritionFacts1(int servingSize, int servings, int calories,
			int fat, int sodium) {
		this(servingSize,servings,calories,fat,sodium,0);
	}
	
	public NutritionFacts1(int servingSize, int servings, int calories,
			int fat, int sodium, int carbohydrate){
		this.servingSize = servingSize;
		this.servings = servings;
		this.calories = calories;
		this.fat = fat;
		this.sodium = sodium;
		this.carbohydrate = carbohydrate;
	}

	
	
	
	
}

package EightthWeek;
//JavaBeans Pattern - allows inconsistency, mandates mutablility

@SuppressWarnings("unused")
public class NutritionFacts2 {
	private int servingSize= -1;
	private int servings = -1;
	private int calories = 0;
	private int fat = 0;
	private int sodium = 0;
	private int carbohydrate = 0;
	
	public NutritionFacts2() {
	
	}
	//Settlers
	public void setServingSize(int val){
		this.servingSize = val;
	}
	
	public void setServings(int val){
		servings = val;
	}
	
	public void setCalories(int val){
		calories = val;
	}
	
	public void setFat(int val){
		fat = val;
	}
	
	public void setSodium(int val){
		sodium = val;
	}
	public void setCarbohydrate(int val) {
		carbohydrate = val;
	}
	public static void main(String args[]){
		NutritionFacts2 cocaCola = new NutritionFacts2();
		cocaCola.setServingSize(240);
		cocaCola.setServings(30);
		cocaCola.setCalories(100);
		cocaCola.setSodium(28);
		cocaCola.setFat(10);
		cocaCola.setCarbohydrate(200);
	}
	

}

package EightthWeek;
//Builder Pattern


@SuppressWarnings("unused")
public class NutritionFacts3 {
	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 parameter - initialized to default values
		private int calories = 0;
		private int fat = 0;
		private int sodium = 0;
		private int carbohydrate = 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){
			fat = val;
			return this;
		}
		
		public Builder sodium(int val){
			sodium = val;
			return this;
		}
		
		public Builder carbohydrate(int val){
			carbohydrate = val;
			return this;
		}
		
		public NutritionFacts3 build(){
			return new NutritionFacts3(this);
		}
	}
	private NutritionFacts3(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[]){
		NutritionFacts3 cocaCola = new NutritionFacts3.Builder(240,8).
				calories(100).sodium(23).carbohydrate(27).build();
	}
}

尤其是最后一段代码,个人觉得这种写法还是比较好的,它实现了级联式的方法调用!这个虽然以前也见过,但是自己在写代码时还是用的很少!以后要多像这样谢谢Java代码!在编程中,设计模式算是比较难懂的(个人觉得而已,当然算法最难咯),最近也有看设计模式,但是空余时间比较少,看的不多。反正我现在觉得就是,越是对门技术有所了解,就越会觉得还有更多的东西没有懂。我想这种感觉应该是好的吧!

明天还有竞赛,对自己说GOOD LUCK

  

抱歉!评论已关闭.