设计思想之构建器

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值