第二条:遇到多个构造器参数(Constructor Parameters)时要考虑用构建器(Builder)

 

构建器模式(Builder Pattern):

View Code
package edu.sjtu.erplab.builder;

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;

    // 构造器,静态内部类
    public static class Builder {
        // 必要参数
        private final int servingSize;
        private final int servings;
        // 可选参数
        private int calories = 0;
        private int fat = 0;
        private int carbohydrate = 0;
        private int sodium = 0;

        public Builder(int servingSize, int servings) {
            this.servingSize = servingSize;
            this.servings = servings;
        }

        public Builder calories(int val) {
            calories = val;
            return this;//返回Builder类对象本身,以便把调用链接起来
        }

        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);
        }
    }

    private NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "["+
                "servingSize:"+servingSize+
                ",servings:"+servings+
                ",calories:"+calories+
                ",fat:"+fat+
                ",sodium:"+sodium+
                ",carbohydrate:"+carbohydrate+
                "]";
    }

    public static void main(String[] args) {
        NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
                .calories(100).sodium(35).carbohydrate(27).build();
        
        System.out.println(cocaCola);
    }
}

 

posted @ 2012-06-06 17:05  xwdreamer  阅读(1059)  评论(0编辑  收藏  举报