[디자인 패턴] Builder

Judy·2022년 10월 19일
2

디자인패턴

목록 보기
1/11
post-thumbnail

Builder

Creational Patterns

복잡한 객체단계별로 구성할 수 있는 Creational 디자인 패턴

➡️ 동일한 Builder 코드로 객체의 다양한 유형과 표현을 생성할 수 있다

1. Problem - 왜 필요할까?

많은 프로퍼티와 중첩된 객체를 가진 복잡한 객체는 초기화하는 과정 또한 복잡하다.

이런 경우 초기화 코드가 많은 매개변수를 가진 생성자에 파묻혀 있고, 더 나쁜 경우엔 클라이언트 코드 곧곧에 흩어져있기도 합니다.

예를 들어 House라는 객체가 있다고 생각해봅시다.

간단하게 집을 지으려면 네 개의 벽과 창문, 그리고 지붕을 만들면 됩니다. 하지만 만약 마당이 있고, 난방 시스템을 가진 더 크고 멋진 집을 원한다면 어떨까요?

간단하게 해결하려면 House 클래스를 상속받는 하위 클래스를 만들면 됩니다. 그러나 다양한 집을 원하면 원할 수록 하위 클래스의 수는 어마어마해지고 새로운 요소를 원한다면 더더욱 깊은 계층이 필요하게 됩니다.

let newHouse = House(doors: 2, windows: 4, hasGarage: true, hasPool: true...)

모든 매개변수가 반드시 필요한 것이 아니기 때문에 위와 같은 생성자 호출은 보기에 지저분하게 됩니다.

2. Solution - 어떻게 사용할까?

Builder

Builder 패턴은 클래스에서 객체를 생성하는 코드를 분리하여 Builder라는 별도의 객체로 사용합니다.

Builder 패턴에서는 객체 생성을 일련의 구성 단계로 분리합니다.

ex) 벽 짓기, 문 만들기, 창문 만들기, 지붕 만들기...

중요한 것은 모든 단계를 호출할 필요가 없다는 점! 특정 개체를 생성하기 위해 필요한 단계만 호출 할 수 있습니다.

만약 표현 자체가 달라야 한다면 다양한 Builder를 생성할 수도 있습니다.

ex) 나무로된 집, 벽돌로 된 집, 유리로 된 집...

다양한 Builder들은 공통 인터페이스를 사용해 클라이언트와 상호 작용할 수 있어야 합니다.

Director

Builder를 효율적으로 사용하기 위해 Director라는 별도의 클래스를 구현하여 사용할 수 있습니다.

Director는 빌더 단계에 대한 일련의 호출을 가지고 있어 특정 빌드를 호출할 수 있습니다.

반드시 Director가 필요한 것은 아니지만 다양한 구성 루틴을 구현하여 프로그램 전체에서 재사용할 수 있다는 장점이 있습니다. 또한 클라이언트는 Director만 알고 있고 빌더 내부를 완전히 숨길 수 있습니다.



3. Applicability - 언제 사용하면 좋을까?

  • 초기화에 필요한 매개변수가 많을 때
  • 유사하지만 세부 사항만 다른 개체들의 생성이 필요할 때
  • 복잡한 개체의 생성이 필요할 때

4. Implement - 구현 방법

  1. 모든 개체를 표현하기 위한 공통 구성 단계를 구현할 수 있는지 확인하기
  2. 기본 빌더 인터페이스를 생성하기
  3. 원하는 개체 표현 방식 별로 구체적인 빌더 클래스를 생성하고 구성 단계 구현하기
    • 구성된 결과 개체를 가져오는 메서드를 반드시 구현해야 합니다!
  4. 필요하다면 director 클래스 구현하기
  5. 클라이언트는 builder와 director 개체 모두 생성. director 개체에게 builder 개체를 전달(일반적으로 director의 생성자 매개변수를 통해 전달)

5. Pros and Cons

장점

  • 개체를 단계별로 구성하거나, 구성 단계를 연기하거나, 재귀적으로 단계 실행 가능
  • 동일한 구성 코드를 재사용하여 개체의 다양한 표현을 생성 가능
  • SRP(Single Responsibility Principle) 준수
    - 비즈니스 로직에서 복잡한 구성 코드를 분리

단점

  • 여러 개의 클래스(builder 및 director들)를 생성해야 하기 때문에 전반적인 코드 복잡성 증가
  • 단순한 객체에 적용할 경우 반대로 효율이 떨어질 수 있음




참고 링크

Builder

profile
iOS Developer

0개의 댓글