2015. 1. 27. 01:20




[Android pattern 02] 에서의 안정성과 [Android pattern 03] 에서의 가독성을 결합한 새로운 대안이 바로 빌더 패턴이다. 필수 인자를 포함한 빌더객체를 생성하고 선택인자들을 빌더객체에 추가완료한 후에 빌더객체를 통해 원하는 생성자의 객체를 생성한다. 이렇게 하여 만든 생성자의 객체는 변경 불가능(immutable) 객체이다. 설명만 들어서는 이해하기 힘드니 코드를 살펴보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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 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 );
        }
    }
 
    private NutritionFacts( Builder builder ) { 
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
}
cs


NutritionFacts  의 객체는 변경불가능 하고 빌더에 정의되어 있는 setter 메소드들은 빌더 객체 자신을 반환하므로, 설정메소드를 호출하는 코드는 죽 이어서 쓸 수 있다.


1
2
3
4
5
6
7
8
 
NutritionFacts cocaCola = 
        new NutritionFacts().Builder( 2408)
                        .calories( 100 )
                        .sodium ( 35 )
                        .carbohydrate( 27 )
                        .build();
 
cs


빌더패턴은 코드의 가독성도 뛰어나고 사용하기도 쉽다.다만 코드 사용량이 점층적 생성자 패턴 등보다는 많으므로 인자가 충분히 많은 상황에서 이용해야하는게 옳다. 물론 새로운 인자가 추가될 수도 있다는 것을 고려해서 사용하는 방법도 괜찮다.


<참고서적 : Effective Java 2/E>

Posted by 미뤽