본문 바로가기

Patterns

Builder - 복잡한 인스턴스 조립하기

Problem 제시

식당을 운영하는 A씨는 매일 식단을 바꾸고 이를 출력하는 프로그램을 만들었다.

최근 웹페이지를 통해 식단을 확인하려는 사람들이 많아져서 식단을 텍스트 포맷으로 뿐만 아니라 HTML 포맷으로도 만들기로 하고 현재 프로그램을 확장하려고 한다.


현재 Model

식단의 구조는 제목(title), 소제목(string), 식단아이템(item)으로 구성

TodayMenu는 이를 private 메소드로 나눠서 구현함



Problem 솔루션 찾기 (문제해결 실습)

▶ 결과 객체 생성 패턴 찾기

- 모든 출력이 양식에 상관없이 해야 할 일들은 무엇인가?

- 식단을 출력하는 일반적인 패턴을 찾으시오.

▶ 추상화하기

- 출력 양식에 따라 변하지 않는 공통점을 찾아 이를 추상화하고 다이어그램으로 표현하시오.

- 공통점 중 구현이 동일한 것과 동일하지 않은 것을 분리하시오.

- 이 두 가지를 어떻게 정의해야 하는지 결정하시오.


솔루션 발표

문제해결을 위해 디자인한 다이어그램과 개발 소스를 기준으로 발표할 것.









패턴 소개 - Builder 패턴


▶ 의도

- 복잡한 객체를 생성하는 방법을 별도의 클래스로 분리

- 서로 다른 구현이라도 동일한 구축 공정을 사용

▶ 동기

- Problem을 통해서 나타난 문제점을 Builder 패턴을 통해 그 대안을 찾고자 함.

 복잡한 객체 생성 패턴 찾기

 생성 패턴 추상화





복잡한 객체 생성 패턴 찾기

식단은 식단제목, 소제목, 아이템으로 구성되어 있으며 그 양식에 상관없이 제공되어야 할 기능은 아래와 같음






생성 패턴 추상화

- 공통점 중 동일한 행위를 하는 것과 동일하지 않는 부분을 분리

- 추상화된 행위와 구체화된 구현을 분리




TodayMenu : 양식에 상관없이 메뉴를 구성한다. 양식에 따라 결과를 생성하는 것은 builder에기 맡긴다(위임).

MenuBuilder : 양식에 따라 구현이 변경되어야 할 행위들을 정의한다.

TextMenuBuilder, HTMLMenuBuilder : 양식에 따라 달라지는 부분을 실제 구현한다.





적용

복합 객체의 생성 알고리즘이 합성하는 요소와 독립적일 때

- 합성하는 요소가 무엇인지는 생성 알고리즘이 관여하지 않음

- 합성하는 요소가 무엇인지는 나중에 동적으로 결정

합성할 객체들의 표현이 다르더라도 동일한 구축 공정을 가져야 할 때


고려사항

위 요구 사항을 Template Method 패턴으로 해결해 보자

Builder 패턴과 어떤 점이 다른가?



구조


Builder 패턴의 등장인물


Builder(건축자)의 역할

Builder의 역할은 인스턴스를 생성하기 위한 인터페이스(API)를 결정합니다. Builder 역할에는 인스턴스 각 부분을 만들기 위한 메소드가 준비되어 있습니다.

예제 프로그램의 MenuBuilder 클래스


ConcreteBuilder(구체적인 건축자)의 역할

ConcreteBuilder 역할은 Builder 역할의 인터페이스(API)를 구현하고 있는 클래스입니다. 실제의 인스턴스 작성으로 호출되는 메소드가 여기에서 정의됩니다. 또한 최종적인 결과를 얻기 위한 메소드가 준비되어 있습니다. 

예제 프로그램의 TextMenuBuilder, HTMLMenuBuilder 클래스


Director(감독자)의 역할

Director의 역할은 Builder역할의 인터페이스(API)를 사용해서 인스턴스를 생성합니다. ConcreteBuilder 역할에 의존한 프로그래밍은 수행하지 않습니다. ConcreteBuilder 역할과 관계없이 제대로 기능하도록 Builder 역할의 메소드만을 사용합니다. 

예제 프로그램의 TodayMenu 클래스


Client(의뢰인)의 역할

Builder 패턴을 이용하는 역할입니다.

예제 프로그램의 Client 클래스