您的位置:首页 > 其它

设计思想之构建器

2016-04-10 12:09 447 查看
我们都知道,构造器有一个局限性,就是不能很好地扩展到大量的可选参数。如:用一个类来表示包装食品外面显示的营养成分。这些标签中有几个属性是必须的:每份的含量、每罐的含量和每份的卡路里,还有超过20几个属性是可选的。

对于这样的的类,应该用怎样编写构造方法呢?我们一项习惯采用构造方法重载的方式来实现,但这样如果要使创建对象灵活,其构造方法之多可想而知了。那么,让我们来试试使用构建器来实现吧!

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;

private NutritionFacts(Builder builder){

servingSize=builder.servingSize;

servings=builder.servings;

calories=builder.calories;

fat=builder.fat;

sodium=builder.sodium;

carbohydrate=builder.carbohydrate;

}

public static class Builder{

//必要的参数

private final int servingSize;

private final int servings;

//可选参数

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 NutritionFacts
build(){

return new NutritionFacts(this);

}

}

public static void main(String[] args)
{

NutritionFacts cocaCola1=new NutritionFacts.Builder(240,8).build();

NutritionFacts cocaCola2=newNutritionFacts.Builder(240,8).calories(100).build();

NutritionFacts cocaCola3=new NutritionFacts.Builder(240,8).sodium(35).build();

}

}

大家有没有觉得比起构造方法简单、灵活多了呢?如果以后遇到这样的问题,就请大家尝试着用构建器方法来解决吧!

参考:effective java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: