Builder Part. 02

최완식·2022년 8월 9일
0

Design Patterns

목록 보기
6/26
post-thumbnail

GoF의 디자인 패턴, 두번째 빌더 패턴에 대해 알아본다.

해당 글은, 다음의 코드를 기반으로 이해하는 것이 편리합니다.

핵심 요약

복잡한 구성의 객체를 효과적으로 생성하는 패턴

  • 두가지 경우에 자주 사용됨
    1. 생성시 지정해야 하는 인자가 많을 때
    2. 객체 생성시 여러단계를 순차적으로 거칠 때
      • 단계의 순서를 결정해두고 각 단계를 다양하게 구현할 수 있도록 함
  • 이 글에서는 두번째 경우를 주로 설명함

예시

  • 데이터를 받아 여러 포맷으로 변경하는 작업을 해야한다고 생각해보자.
  • Director는 Builder를 받아 맞는 포맷의 순서로 조작한 뒤 결과를 만들 것이다.
internal func main() {
    
    // Plain
    var data = Data(name: "wansik", age: 28)
    var builder: Builder = PlainTextBuilder(data: data)
    var director = Director(builder: builder)
    
    var result = director.build()
    print(result)
    
    // JSON
    data = Data(name: "wansik", age: 28)
    builder = JSONBuilder(data: data)
    director = Director(builder: builder)
    
    result = director.build()
    print(result)
    
    // XML
    data = Data(name: "wansik", age: 28)
    builder = XMLBuilder(data: data)
    director = Director(builder: builder)
    
    result = director.build()
    print(result)
}
  • 만들어진 Builder는 Data를 변환하는데 사용된다.
  • Builder class를 사용하는 class라면 모두 Director라 할 수 있다.
  • Builder 패턴은 Template, Facade, Strategy 패턴을 객체의 생성 과정에 적용했다고도 볼 수 있다.
  • Director는 Builder객체가 가지는 method들의 사용을 단순화 시켜주고 있다. (Facade)
  • Builder를 통해 생성하는 과정에서 호출되는 method를 interface로 선언하고, 구현은 하위 클래스에서 한 뒤, method들의 호출 방식을 Director에서 처리하는 것 (Template 응용)
  • 원하는 상황에 맞는 형식에 문자열로 변환 (Strategy)
    • 사실 단순하고, OOP의 기본 원칙을 적용하면 나오는 것이기 때문에 다른 곳에서도 종종 살펴볼 수 있다.

활용성

  • 객체 생성에 있어 인자가 많은 경우
  • 객체의 생성 알고리즘이 달라질 필요가 있을 때

참여자

  • Builder(Builder): Product 객체의 일부 요소를 생성하기 위한 추상 인터페이스를 정의
  • ConcreteBuilder(PlainTextBuilder...): Builder 인터페이스를 구현하며 부품을 모아 제품을 조립함
  • Director(Director): Builder 인터페이스를 사용하는 객체를 가지고 제품을 합성함
  • Product(String): 생성할 복합 객체

협력 방법

  • Client는 Director 객체를 생성하고, Builder를 통해 객체를 합성한다.
  • 제품의 일부가 구축될 때마다 Director는 Builder에 알린다.
  • Builder는 Director의 요청을 처리하여 제품에 부품을 추가한다.
  • Director는 Builder에서 제품을 검색한다.(리턴 받는다.)

결과

  1. 제품에 대한 내부 표현을 다양하게 변화할 수 있다.
  2. 생성과 표현에 대한 코드를 분리한다.
    • 생성은 Builder, 표현은 Director
  3. 복합 객체를 생성하는 절차를 좀더 세밀하게 나눌 수 있다.
    • Builder에는 제품을 만드는 과정 자체가 반영되어 있다.
    • 그렇기 때문에 이 순서를 조작하는 행위를 좀더 세밀하게 처리할 수 있다.

관련 패턴과 차이점

  • 복잡한 객체를 생성해야 한다면 추상 팩토리 패턴은 빌더 패턴과 유사할 수 있다.
  • 근본적인 차이가 있다면, 빌더 패턴은 복잡한 객체의 단계별 생성에 중점을 둔다는 것이다.
  • 반면 추상 팩토리 패턴은 제품의 유사군이 존재할 때 유연한 설계에 중점을 둔다는 것이다.
  • 빌더 패턴은 생성의 마지막에 제품을 반환한다.
  • 추상 팩토리 패턴은 즉시 제품을 반환한다.

Reference

profile
Goal, Plan, Execute.

0개의 댓글