프로그래밍/디자인패턴

디자인 패턴 - Builder (Creational Pattern)

aiemag 2021. 2. 27. 22:16
반응형

Creational Pattern인 Builder Pattern에 대해 정리합니다.

 

Builder는 전체를 만들기 위해 하나씩 부분부터 만들어 갑니다.


Definition

 

Builder는 Set of Objects의 생성 과정과, 만들어진 Set of Objects 의 표현 과정을 분리함.

- Builder는 Director에 의해서 만들어지는 과정이 encapsulation 됨.

- 만들어진 Set of Objects의 결과만 Client가 사용할 수 있도록 함.

- Director는 Product가 만들어지는 step은 Builder를 통하여 알 수 있지만, Product가 어떻게 만들어지는지 detail은 모름.

 

Builder는 만드는 부분 위주로 집중합니다.

 

목적

- 쉽게 교체 가능한 알고리즘을 기반으로 동적인 객체들의 묶음을 생성하기 위해

 

사용 시점

- 생성하는 과정을 런타임 시점에서 제어가 필요할 때

- 생성 알고리즘의 다양한 표현이 필요할 때

- 생성 알고리즘이 시스템으로부터 분리되어야 할 때 

- 생성 로직의 추가가 코드의 변경없이 이루어지도록 할 때 

 


Class Diagram

Director에 의해 Builder는 작업을 하나씩 하게됩니다.

DIrector의 construct() 함수에 의해 Builder의 각 part를 build하게 됩니다.

Client는 ConcreteBuilder가 만들어 놓은 작업물을 getResult()를 통하여 확인할 수 있습니다.


Sample Case

다음은 Builder 패턴을 적용한 시나리오입니다.

 

Scenario

 

우리는 일기장을 만들려고 합니다.

 

그냥 만드는 것은 심심하기 때문에 전체 글을 소문자로 만드는 것과 대문자로 만드는 일기장빌더를 제공하고자 합니다.

 

일기장은 Director를 통해서 소문자 빌더(LowerCaseBuilder) 혹은 대문자 빌더(UpperCaseBuilder)로 만들 수 있습니다.

 

Class Diagram

DIrector는 builder instance가지고 있으며, construct() 내에서 Builder의 세부적인 작업을 실행시킵니다.

Builder가 생성한 결과물은 getText()를 통하여 외부에서 전달 받을 수 있습니다.

 

Code

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
 
    public static void main(String[] args) {        
        LowerCaseBuilder lcb = new LowerCaseBuilder();
        Director director = new Director(lcb);
        director.construct();
        System.out.println(lcb.getText());
        
        UpperCaseBuilder ucb = new UpperCaseBuilder();
        director = new Director(ucb);
        director.construct();
        System.out.println(ucb.getText());
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Director {
    private Builder builder;
    public Director(Builder builder) {
        this.builder = builder;
    }
    
    public void construct() {
        builder.makeTitle("Diary (2021.02.27)");
        builder.makeContents("I woke up at 7:00 AM.");
        builder.makeContents("I was so happy because of my son.");
        builder.makeClosing();
    }
}
cs

 

1
2
3
4
5
public abstract class Builder {
    public abstract void makeTitle(String title);
    public abstract void makeContents(String contents);
    public abstract void makeClosing();
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class LowerCaseBuilder extends Builder{
    private StringBuffer buffer = new StringBuffer();
    
    public void makeTitle(String title) {
        buffer.append(title.toLowerCase());
        buffer.append("\n");
    }
    
    public void makeContents(String contents) {
        buffer.append(contents.toLowerCase());
        buffer.append("\n");
    }
    
    public void makeClosing() {
        buffer.append("the end\n");
    }
    
    public String getText() {
        return buffer.toString();
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class UpperCaseBuilder extends Builder{
    private StringBuffer buffer = new StringBuffer();
    
    public void makeTitle(String title) {
        buffer.append(title.toUpperCase());
        buffer.append("\n");
    }
    
    public void makeContents(String contents) {
        buffer.append(contents.toUpperCase());
        buffer.append("\n");
    }
    
    public void makeClosing() {
        buffer.append("THE END\n");
    }
    
    public String getText() {
        return buffer.toString();
    }
}
cs

 

 

실행 결과

 

 

반응형