设计思想之构建器
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
对于这样的的类,应该用怎样编写构造方法呢?我们一项习惯采用构造方法重载的方式来实现,但这样如果要使创建对象灵活,其构造方法之多可想而知了。那么,让我们来试试使用构建器来实现吧!
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
相关文章推荐
- 【leetcode】4. Median of Two Sorted Arrays
- js2php js转php的使用小结
- 操作系统发展的简单历程
- NKOI 2747 最小生成树1
- Java浅复制与深复制的区别
- JS中的继承
- 强大的负边距(转)
- Matlab中image、imagesc和imshow函数用法解析
- 设计思想之复合应该优于继承
- python编码格式
- 20145314郑凯杰 《Java程序设计》第6周学习总结
- POJ 3767 I Wanna Go Home【最短路floyd】
- OPENGGL深度测试
- setsockopt
- CentOS 服务器安全设置
- 关于如何提高sql语句执行效率(网上整理)
- 大鱼吃小鱼游戏代码 基于java-swing
- hdu-1428 漫步校园(BFS+记忆化搜索)
- 反射机制总结
- Unity中Microphone类进行录音保存