빠에야는 개발중

빌더 패턴 본문

공부/디자인패턴

빌더 패턴

빠에야좋아 2018. 3. 19. 22:25

어떤 클래스의 객체를 생성하여 초기화를 해주고 싶다.

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
public class PersonInfo {
    private String name;
    private Integer age;
    private String favoriteColor;
    private String favoriteAnimal;
    private Integer favoriteNumber;
 
    public PersonInfo(String name, Integer age, String favoriteColor, String favoriteAnimal, Integer favoriteNumber){
        this.name = name;
        this.age = age;
        this.favoriteColor = favoriteColor;
        this.favoriteAnimal = favoriteAnimal;
        this.favoriteNumber = favoriteNumber;
    }
 
    public String getName() {
        return name;
    }
 
    public Integer getAge() {
        return age;
    }
 
    public String getFavoriteColor() {
        return favoriteColor;
    }
 
    public String getFavoriteAnimal() {
        return favoriteAnimal;
    }
 
    public Integer getFavoriteNumber() {
        return favoriteNumber;
    }
 
    public String getPersonInfo(){
        String personInfo = String.format("name:%s, age:%d, favoriteColor:%s, favoriteAnimal:%s, favoriteNumber:%d"
                , name, age, favoriteColor, favoriteAnimal, favoriteNumber);
        return personInfo;
    }
}
cs


위 클래스는 setter 메소드가 없기 때문에 반드시 생성자를 통한 초기화를 해주어야한다. 그렇다면 일부 값만 넣고 싶을 때는 어떻게 해야할까? ("이름", 25, null, null ...) 이런 식이라면 가독성이 좋지 않고 생성자 오버로딩을 하자니 새로운 값이 추가되거나 하면 엄청난 수정이 기다리고 있다. 또 순서를 틀리면 어떻게 해야하나? 문제 투성이다.


그러니 빌더 패턴을 사용해보자.

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
public class PersonInfoBuilder {
    private String name;
    private Integer age;
    private String favoriteColor;
    private String favoriteAnimal;
    private Integer favoriteNumber;
 
    public PersonInfoBuilder setName(String name) {
        this.name = name;
        return this;
    }
 
    public PersonInfoBuilder setAge(Integer age) {
        this.age = age;
        return this;
    }
 
    public PersonInfoBuilder setFavoriteColor(String favoriteColor) {
        this.favoriteColor = favoriteColor;
        return this;
    }
 
    public PersonInfoBuilder setFavoriteAnimal(String favoriteAnimal) {
        this.favoriteAnimal = favoriteAnimal;
        return this;
    }
 
    public PersonInfoBuilder setFavoriteNumber(Integer favoriteNumber) {
        this.favoriteNumber = favoriteNumber;
        return this;
    }
 
    public PersonInfo build(){
        PersonInfo personInfo = new PersonInfo(name, age, favoriteColor, favoriteAnimal, favoriteNumber);
        return personInfo;
    }
}
cs


이렇게 setter 메소드를 만들어서 this 객체를 반환하고, build 메소드로 객체를 생성하게 되면 순서나 가독성 면에서 좋은 코드를 짤 수 있게 된다. 어디 한 번 사용해보자.

1
2
3
4
5
6
7
8
9
10
11
PersonInfoBuilder personInfoBuilder = new PersonInfoBuilder();
        // 빌더 객체에 원하는 데이터를 입력합니다. 순서는 상관 없습니다.
        PersonInfo result = personInfoBuilder
                .setName("홍길동")
                .setAge(25)
                .setFavoriteAnimal("고양이")
                .setFavoriteColor("검정")
                .setName("이희백"// 다시 같은 메소드를 호출한다면 나중에 호출한 값이 들어갑니다.
                .setFavoriteNumber(3)
                // 마지막에 .build() 메소드를 호출해서 최종적인 결과물을 만들어 반환합니다.
                .build();
cs


읽기 쉬운 코드가 완성되었다.


'공부 > 디자인패턴' 카테고리의 다른 글

싱글톤 패턴  (0) 2018.03.15
템플릿 메소드 패턴  (0) 2018.03.14
팩토리 패턴  (0) 2018.03.14
Comments