[모던C++디자인패턴] 2. 빌더 패턴

짜장범벅·2022년 6월 4일
0

모던CPP디자인패턴

목록 보기
1/4

2. 빌더 패턴(Builder Pattern)

  • 목적
    • 생성이 까다로운 객체를 쉽게 처리
    • 생성자 호출로 쉽게 생상할 수 없는 객체 다루기
    • 다른 객체들의 조합으로 구성

2.1 시나리오

2.2 단순한 빌더

  • 단순한 빌더는 객체의 생성을 별도의 다른 클래스에 위임

2.3 흐름식 빌더

  • 흐름식 빌더는 빌드 시 자기 자신을 참조로서 리턴
  • 흐름식 빌더 형태로 호출하는 것을 흐름식 인터페이스(Fluent Interface)라 함

2.4 의도 알려주기

  • 사용자에게 빌더 클래스를 강요하는 방법
  • 빌더를 사용하지 않으면 객체 생성이 불가능하도록 강제
class HtmlElement {
  ...
  static unique_ptr<HtmlBuilder> build(const string& root_name){
    return make_unique<HtmlBuilder>(root_name);
  }

  protected:
  HtmlElement(){} //Hide Initializer
};

위 코드의 특징
1. 모든 생성자를 protected로 숨겨 사용자가 사용할 수 없게 함
2. HtmlElement 자체에 팩토리 메서드를 두어 빌더를 생성
3. static으로 선언한 빌더의 unique pointer로 인해 팩토리 메서드 중복 생성 방지

사용 예시:

auto builder = HtmlElement::bulder("ul"); //expected unique_ptr<HtmlBuilder>
builder.add_child("li", "hello").add_child("li", "world"); //흐름식 빌더

빌더로 HtmlElement를 만드는 것이 목적이기 때문에 아래 Operator를 선언

class HtmlBuilder{
  operator HtmlElement() const {return root;}
  HtmlElement HtmlBuilder::build() const {return root;}
  HtmlElement root;
  ...
};

...

HtmlElement e = HtmlElement::build("ul")
  .add_child("li", "hello")
  .add_child("li", "world");
profile
큰일날 사람

0개의 댓글