一个超强的变builder模式构建多参数构造器

来源:互联网 发布:绣花软件 编辑:程序博客网 时间:2024/05/22 00:50

遇到多个构造器参数时候需要考虑使用Builder模式来创建对象

public class NutritionFacts {//定义营养包装类


    privatefinal int servingSize;
    privatefinal int servings;
    privatefinal int calories;
    privatefinal int fat;
    privatefinal int sodium;
    privatefinal int carbohydrate;


    publicstatic class Builder {


       // Required parameters
       private final int servingSize;
       private final int servings;
       // Optional parameters - initialized to default values
       private intcalories     = 0;
       private intfat          = 0;
       private int carbohydrate  = 0;
       private intsodium       = 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 carbohydrate(int val)
           { carbohydrate = val;  return this; }
       public Builder sodium(int val)
           { sodium =val;       return this; }

       public NutritionFacts build() {
           return new NutritionFacts(this);   //内部类的方法返回外部类的实例对象,并将对象自己作为参数传入
       }
    }

 

    // 外部类的私有构造函数

     privateNutritionFacts(Builder builder) {
       servingSize  = builder.servingSize;
       servings    = builder.servings;
       calories    = builder.calories;
       fat         = builder.fat;
       sodium      = builder.sodium;
       carbohydrate = builder.carbohydrate;
    }


    publicstatic void main(String[] args) {

       NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100).sodium(35).carbohydrate(27).build();

    }
}


       //注意main方法中,这里是最关键的一句

       // NutritionFacts cocaCola 定义类外部对象的引用 cocaCola

       // new NutritionFacts.Builder(240, 8),这一句先new出一个内部类的实例,注意方法,先new,再外部类.内部类()的方式

       //注意到内部类中的每个方法都返回的是this,即builder对象本身,所以可以继续用 .method()的串联方式,即.calories(100).sodium(35).carbohydrate(27).build()

       //注意最后一个方法 build(),调用外部类的私有构造函数,即用new的方式返回的外部类对象的实例。这是巧妙之处,在内部类中实例化,然后将this参数传入到外部类的私有构造函数中,最后还是返回外部类的实例

这样客户端代码就很容易编写,而且易于阅读。



原创粉丝点击