티스토리 뷰

Study/디자인 패턴

04 Builder 패턴

Lkt_Programmer 2017. 9. 14. 15:00
반응형

Builder 패턴

 

빌더 패턴이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴입니다.

 

 

빌더 패턴(Builder Pattern) 사용 이유

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class PersonInfo {
    
    private String name;
    private int age;
    private String email;
    private String number;
    
    public PersonInfo(String name,int age,String email,String number)
    {
        this.name = name;
        this.age = age;
        this.email = email;
        this.number = number;
    }
 
}
 

다음과 같이 사람의 정보를 저장하는 PersonInfo 클래스가 존재합니다.

해당 클래스의 객체 생성자를 생성하기 위해서는 4개의 인자를 가지는 생성자를 호출해야 합니다. 하지만 다음과 같이 여러가지 경우가 있을 수 있습니다.

 

name속성과 email 속성 값만을 알고 있을 경우

 

 PersonInfo person = new PersonInfo(name,null,email,null)

 

name만 알고 있는 경우

 

 PersonInfo person = new PersonInfo(name,null,null,null)

 

와 같은 경우 말고도 수많은 경우가 발생 할 수 있습니다.

그렇다고 경우에 따른 생성자를 전부 구현 할 수 없을 뿐더러 다른 문제로는 인자의 순서도 파악을 해야 한다는 문제가 발생합니다.

 

이때 사용하는 것이 Builder 패턴입니다. Builder 클래스를 중간에 두고 PersonInfo 객체에 들어갈 인자 값을 차례차례 받아들이고 이 변수를 통합해서 한번에 PersonInfo()객체를 생성하여 반환하는 것입니다.

 

빌더 패턴(Builder Pattern) 적용하기

 

이제 PersonInfo 객체 생성을 Builder를 통해서 생성해보겠습니다.

 

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
public class PersonInfo {
    
    private String name;
    private int age;
    private String email;
    private String number;
    
    public static class Builder
    {
        private String name;
        private int age;
        private String email;
        private String number;
        
        public Builder(String name, int age)
        {
            this.name=name;
            this.age = age;
        }
        public Builder setemail(String email)
        {
            this.email=email;
            return this;
        }
        public Builder setnumber(String number)
        {
            this.number=number;
            return this;
        }
        public PersonInfo build()
        {
            return new PersonInfo(this);
        }
    }
    private PersonInfo(Builder builder)
    {
        this.name=builder.name;
        this.age=builder.age;
        this.email=builder.email;
        this.number=builder.number;
    }
}
 

PersonInfo() 클래스 내부에 static으로 선언된 Builder 클래스가 구현됩니다.

Builder() 클래스의 생성자는 필수인자 값들을 setting을 하고 나머지 선택인자에 대해서는 setter메서드를 통하여 구현이 됩니다. 인자 값이 setting이 완료가 되면 build() 메서드를 통해 builder 객체를 인자로 하는 PersonInfo()객체를 생성하여 반환하게 됩니다.

 

마지막 PersonInfo의 생성자에서는 인자로 받은 builder 객체의 속성값들을 다시 setting을 해주게 됩니다. 실제 사용자가 사용하는 방법을 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
public class Main {
    
    public static void main(String argsp[])
    {    
        PersonInfo person =new PersonInfo.Builder("이기택",27)
                            .setemail("email!")
                            .setnumber("number!")
                            .build();
    }
 
}

예제는 복합 객체 안에 builder 객체를 포함하는 구조이지만 두개를 따로 구현을 해도 상관은 없습니다.

 

반응형

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

06 프록시 패턴 (Proxy Pattern)  (0) 2017.09.21
05 어댑터 패턴 (Adapter Pattern)  (0) 2017.09.16
03 Template Method 패턴  (2) 2017.09.10
02 Singleton 패턴  (0) 2017.09.09
01 Strategy 패턴  (0) 2017.09.04