Featured image of post 14. 다양한 패턴 빠르게 알아보기 - 빌더 패턴

14. 다양한 패턴 빠르게 알아보기 - 빌더 패턴

헤드 퍼스트 디자인 패턴

빌더(Builder) 패턴

제품을 여러 단계로 나눠서 만들도록 제품 생상 단계를 캡슐화하고 싶다면 빌더 패턴이 적합하다.

빌더 패턴은 객체 생성을 더욱 유연하게, 가독성있고, 그리고 복잡성을 낮추기 위한 디자인 패턴 중 하나이다.

이 패턴은 복잡한 객체의 생성 과정을 추상화하고, 객체의 표현과 생성 프로세스를 분리하여 클라이언트가 서로 다른 표현 결과물을 생성할 수 있도록 한다.

  1. 복잡한 객체 생성
    • 객체가 복잡하고 여러 단계에 걸쳐 생성되어야 할 때 빌더 패턴이 유용할 수 있다.
  2. 다양한 표현 결과물 생성
    • 동일한 생성 프로세스에서 여러 다른 종류의 객체를 생성하고자 할 때 사용할 수 있다.
  3. 가독성 및 유지보수성 향상
    • 생성자의 매개변수가 많고 복잡한 경우, 빌더 패턴을 사용하여 가독성을 향상시키도 코드를 더욱 유지보수하기 쉽게 만든다.

구성 요소

빌더 패턴 구조

  • Product: 생성될 객체
    • 빌더 패턴을 통해 성성될 최종 객체
  • Builder: 빌더
    • 객체를 생성하는 추상 인터페이스
    • 객체의 각 부분을 생성하기 위한 메서드들을 선언
  • ConcreteBuilder
    • Builder 인터페이스를 구현하여 객체의 각 부분을 실제로 생성하는 클래스
  • Director: 지시자
    • 클라이언트와 함께 작동하여 실제로 객체를 생성하는 클래스
    • Builder를 사용하여 객체의 생성 프로세스를 조절한다.
  • Client
    • 객체를 생성하고자 하는 클라이언트 코드
    • 일반적으로 Director를 사용하여 객체 생성 프로세스를 시작한다.

예시: HTML 문서 생성

HTMLDocument가 생성될 최종 객체를 나타내고, HTMLBuilder는 객체 생성을 위한 추상 인터페이스를 정의한다.

SimpleHTMLBuilderHTMLBuilder 인터페이스를 구현하여 객체의 각 부분을 생성하고, HTMLDirector는 실제로 객체의 생성 프로세스를 조절한다.

 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Product: 생성될 HTML 문서
public class HTMLDocument {
    private String content;

    public void setContent(String content) {
        this.content = content;
    }

    public void display() {
        System.out.println(content);
    }
}

// Builder: HTML 문서 생성을 위한 인터페이스
public interface HTMLBuilder {
    void buildHeader();
    void buildBody();
    void buildFooter();
    HTMLDocument getResult();
}

// ConcreteBuilder: HTML 문서를 실제로 생성하는 클래스
public class SimpleHTMLBuilder implements HTMLBuilder {
    private HTMLDocument document;

    public SimpleHTMLBuilder() {
        this.document = new HTMLDocument();
    }

    @Override
    public void buildHeader() {
        document.setContent("<header>Simple HTML Header</header>");
    }

    @Override
    public void buildBody() {
        document.setContent(document.content + "<body>Simple HTML Body</body>");
    }

    @Override
    public void buildFooter() {
        document.setContent(document.content + "<footer>Simple HTML Footer</footer>");
    }

    @Override
    public HTMLDocument getResult() {
        return document;
    }
}

// Director: HTML 문서 생성 프로세스를 조절하는 클래스
public class HTMLDirector {
    private HTMLBuilder builder;

    public HTMLDirector(HTMLBuilder builder) {
        this.builder = builder;
    }

    public void construct() {
        builder.buildHeader();
        builder.buildBody();
        builder.buildFooter();
    }
}

// Client: 빌더 패턴을 사용하는 클라이언트 코드
public class Client {
    public static void main(String[] args) {
        HTMLBuilder builder = new SimpleHTMLBuilder();
        HTMLDirector director = new HTMLDirector(builder);

        director.construct();
        HTMLDocument document = builder.getResult();
        document.display();
    }
}

특징

빌더 패턴은 객체 생성을 유연하게 다루기 위한 디자인 패턴으로 이로인한 장단점이 존재한다.

장점

  1. 유연한 객체 생성
    • 객체 생성 과정을 세분화하고 각 부분을 개별적으로 생성함으로써 객체 생성을 유연하게 다룰 수 있다.
    • 다양한 조합으로 객체를 생성할 수 있다.
  2. 가독성 향상
    • 생성자의 매개변수가 많은 경우, 빌더 패턴을 사용하여 가독성을 향상시킬 수 있다.
    • 메개변수의 순서를 기억하지 않고도 명시적인 메서드 호출을 통해 객체를 초기화할 수 있다.
  3. 객체 표현의 분리
    • 객체 생성과표현을 분리함으로써, 동일한 생성 로직을 사용하면서도 여러 다른 표현이 가능하다.
    • 즉, 동일한 빌더로 다른 결과물을 만들 수 있다.
  4. 확장 용이성
    • 새로운 부분 객체나 다른 종류의 객체를 추가하고자 할 때, 새로운 빌더를 구현하여 쉽게 확장할 수 있다.

단점

  1. 코드 복잡성
    • 빌더 패턴을 도입하면 클래스의 수가 증가하고, 빌더 클래스와 디렉터 클래스가 추가로 필요하므로 코드의 복잡성이 증가할 수 있다.
  2. 성능 손실
    • 객체 생성 시 매번 빌더 패턴을 사용하면 성능에 손실이 발생할 수 있다.
  3. 불필요한 빌더 클래스 생성
    • 간단한 객체의 경우 빌더 패턴을 도입하면 오히려 불필요한 클래스들이 생성될 수 있다.

빌더 패턴은 객체 생성의 복잡성과 유연성을 고려할 때 선택해야 하는 패턴이다.

작은 규모의 객체나 단순한 객체 생성에는 불필요한 복잡성을 초래할 수 있으므로, 상황에 맞게 적절히 선택하는 것이 중요하다.