프로그래밍/Java

item2 빌더패턴 (생성자 인자가 많을때 고려)

소행성왕자 2020. 5. 28. 09:09

생성자에 인자가 많을때에는 빌더 패턴을 이용한다.

NutritionFacts 클래스는 불변이며

모든 매개변수의 기본값들을 한곳에 모아있다.

빌더의 세터 메서드들은 빌더 자신을 반환하기때문에 연쇄적으로 호출 할수 있다.

 

빌더패턴의 장점은 클라이언트에서 코드는 쓰기 쉽고 읽기 쉽다.

빌터패턴은 파이썬의 명명된 선택적 매개변수를 흉내낸것임.

 

 

package item2;

public class Test {
    public static void main(String[] arg) {
        NutritionFacts coca = new NutritionFacts.Builder(230,8)
                .carbohydrate(100)
                .sodium(35)
                .carbohydrate(27)
                .fat(888)
                .build();

        System.out.println("-----");
        System.out.println(coca.getFat());
    }
}

 

package item2;

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 sodiium = 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) {
            sodiium = val;
            return this;
        }

        public Builder carbohydrate(int val) {
            calories = 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.sodiium;
        carbohydrate = builder.carbohydrate;
    }

    public int getFat() {
        return fat;
    }
}