최상단 광고

2012년 4월 17일 화요일

[Chapter4] 생성 패턴 - 빌더

1. 빌더(Builder) 패턴이란?
  빌더 패턴이란 복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 합니다. 하나의 소스객체에 복잡한 여러개의 객체를 만들 수 있도록 하는 패턴으로 소스 객체는 복잡한 객체를 생성하기 위한 기능을 여러 부분으로 제공합니다.
  즉, 객체를 구성하는 부분을 먼저 생성하고, 이를 조합함으로써 전체 객체를 생성하기 때문에 생성할 객체가 손 쉽게 추가, 확장 가능하게 된다.


2. 빌더는 언제 사용되나?
- 복합 객체의 생성 알고리즘이 이를 합성하는 요소 객체들이 무엇인지 이들의 조립 방법에 독립적일 때
- 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야 할 때

§ 예시 - 세트메뉴 서빙 §
  에피타이저 - 메인 - 디저트" 순으로 음식이 제공된다.
  에피타이저 종류는 ○○ 샐러드, ☆☆ 샐러드, □□ 샐러드 ... 가 있고, 메인 메뉴는 ●● 스테이크, ★★ 스테이크, ◆◆ 스테이크 ...가 있다. 마지막 디저트로는 △△ 아이스크림, ♡♡ 아이스크림, ♧♧ 아이스크림 ... 이 있다.
  손님이 원하는 종류는 선택해서 먹을 수 있다. 이처럼 세트 메뉴를 에피타이저 -> 메인 -> 디저트 순으로 음식이 나오지만 그 결과가 달라진다. 이때 bulider 패턴을 사용한다.


3. 빌더 패턴의 다이어그램 
▲ 구조 다이어그램

▲ 상호작용 다이어그램

☆ Builder
: Product 객체의 일부 요소들을 생성하기 위한 추상 인터페이스를 정의합니다.

☆ ConcreteBuilder
: Builder 클래스에 정의된 인퍼페이스를 구현하며, 제품의 부품들을 모아 빌더를 복합니다. 생성한 요소의 표현을 정의하고 관리합니다. 또한 제품을 검색하는데 필요한 인터페이스를 제공합니다.
: 제품의 내부 표현을 구축하고 복합 객체가 어떻게 구성되는지에 관한 절차를 정의합니다.
: 구상 빌더에서는 실제 제품을 만들어서 Product라는 복합 구조에 집어 넣습니다.

☆ Director (Client)
: Builder 인터페이스를 사용하는 객체를 합성합니다.

☆ Product
 : 생성할 복합 객체를 표현합니다.




4. 빌터 패턴을 쓰면....
1) 제품에 대한 내부 표현을 다양하게 변화할 수 있습니다.
  Builder 객체는 디렉터를 제공하고 제품을 복합하기 위해 필요한 추상 인터페이스를 정의합니다. 빌더를 사용하면 제품이 어떤 요소에서 복합되는지, 그리고 각 요소들의 표현 방법이 무엇인지 가릴 수 있게 됩니다. 즉, 어떤 요소로 전체 제품을 복합하고 그 요소들이 어떤 타입들로 구현되는지 알고 있는 쪽은 빌더뿐입니다. 제품을 복합할 때는 빌더에 정의된 추상 인터페이스를 통해 사용자가 동작하기 때문에, 새로운 제품의 표현 방법이나 제품의 복합 방법이 바뀔 때 추상 인터페이스를 정의한 Builder 클래스에서 상속을 통해 새로운 서브클래스를 정의하면 됩니다.

2) 생성과 표현에 필요한 코드를 분리합니다.
  빌더 패턴을 사용하면, 복합 객체를 생성하고 복합 객체의 내부 표현 방법을 별도의 모듈로 정의 할 수 있습니다. 사용자는 제품의 내부 구조를 정의한 클래스는 전혀 모른 채, 빌더와 상호작용을 통해서 필요한 복합 객체를 생성하게 됩니다. 왜냐하면, 이러한 제품 구조에 대한 상세한 정의를 담은 클래스는 클래스에 정의된 어떤 연산의 매개변수로도 정의되지 않기 때문입니다.

3) 복합 객체를 생성하는 절차를 좀 더 세밀하게 나눌 수 있습니다.
  한 번에 복합 객체를 생성하는 것 처럼, 빌더 패턴은 디렉터의 통제 아래 하나의 내부 구성요소들을 만들어 나갑니다. 디렉터가 빌더에서 만든 전체 복합 객체를 되돌려받을 때까지 제품 복합의 과정은 계속됩니다.

4) 클라이언트에서는 추상 인터페이스만 볼 수 있기 때문에 제품은 구현한 코드를 쉽게 바꿀 수 있습니다. 또한 제품의 내부 구조를 보호 할 수 있습니다.

5) 팩토리를 사용하는 경우에 비해 객체를 만들기 위해서 클라이언트에 대해 더 많이 알아야 합니다.

cf) 관련패턴
: 복잡한 객체를 생성할 때 추상 팩토리 패턴은 빌더 패턴과 비슷한 모습을 보입니다. 근복적인 차이가 있다면 빌더 패턴은 복잡한 객체의 단계별 생성에 중점을 둔 반면, 추상 팩토리 패턴은 제품의 유사군들이 존재할 때 유연한 설계에 중점을 둔다는 것입니다. 빌더 패턴은 생성의 마지막 단계에서 생성한 제품을 반환하는 반면, 추상 팩토리 패턴에서는 만드는 즉시 제품을 반환합니다. 추상 팩토리 패턴에서 만드는 제품은 꼭 모여야만 의미 있는 것이 아니라 하나만으로도 의미기 있기 때문입니다.

댓글 없음: