빌더 패턴

빌더 패턴은 복잡한 객체 생성 과정을 단순화하고 객체의 다양한 속성을 설정하는 방법을 제공하는 디자인 패턴 이다.

 

이해가 잘 되지 않는다. 바로 예제를 살펴보자

 


빌더 패턴 예제

콜라 같은 식품의 영양 정보표를 만들어보자. 이 표에는 요구되는 필수 정보와 넣어도 되고 넣지 않아도 되는 선택적 정보를 포함한다.

필수 정보

- 1회 분량(serving size), 총 분량(servings) ...

선택 정보

- 지방(total fat), 포화지방(saturated fat), 트랜스 지방(trans fat), 나트륨(sodium)...

 

 

이 때, 선택 정보에 대해 생성자를 여러개 만들어 오버로딩할 수 도 있지만 너무 코드가 길어지고  파라미터의 순서나 개수를 파악하기 힘들어 문제가 생긴다. 이 때, 빌더 패턴을 사용한다. 코드를 살펴보자.

 

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 {
        // Required parameters
        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 int getCalories(){
        return calories;
    }
    NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
}

- Builder라는 빌더 클래스를 생성한다. 파라미터로는 필수 정보인 servingSize와 servings를 받는다.

- 선택 정보는 setter의 형태로 메소드를 작성해준다.(set은 붙이지 않아도 된다.) 객체를 생성할 때 포함할지 하지 않을지 선택권을 준다.

- build() 메소드로 객체를 생성하면서 원하는 정보만 가진 객체를 생성할 수 있게 된다.

 

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

- 넣고 싶은 선택 정보만 포함해서 객체를 생성함을 볼 수 있다.

 


정리

- 빌터 패턴은 객체 생성을 직접 하지 않고 필수 요소를 전달한 후 생성자를 호출해서 빌더 객체를 생성한다.

- 빌더 객체에 선택 요소에 대하 setter와 비슷한 메소들을 호출한다.

- build() 메소드를 호출해서 원하는 immutable 객체를 생성한다.

+ Recent posts