본문 바로가기

프로그래밍 강의 메모/코딩으로 학습하는 GoF의 디자인 패턴_백기선

객체 생성과 관련 디자인 패턴 > 빌더 패턴(Builder Pattern)

https://inf.run/6Shr

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

 

빌더 패턴

  • 객체 생성 관련 디자인 패턴.
  • 동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법.
  • 복잡한 객체를 만드는 프로세스를 독립적으로 분리할 수 있다.

 

인스턴스의 세부 설정들을 다양한 구성으로 생성할 수 있는데

이 방법을 동일 프로세스로 설정할 수 있다.

 

 

 

Before 코드로 보는 빌더 패턴의 필요성

1. 사용자가 일부만 설정하여 불완전한 인스턴스가 생성될 가능성이 있다.

여행 계획의 몇 박 며칠을 프로퍼티로 설정할 때, Days와 Nights를 설정하려면 동시에 설정해야 한다.

인스턴스 생성 조건을 강제할 필요가 있다.

 

2. 다양한 파라미터를 지원하는 생성자를 만들 때 파라미터가 너무 많아 장황해진다.

많은 파라미터 중 필요한 것만 선택해서 생성해주는 생성자를 오버로딩할 경우 생성자가 너무 많아지는 문제가 생긴다.

클라이언트는 이러한 생성자에서 어떤 생성자를 선택해서 사용해야 하는지 헷갈리게 된다.

 

 

 

 

 

빌더 패턴을 적용한다면?

빌더에다 인스턴스를 만드는 방법들을 스텝별로 인터페이스에 정의한다.

최종적으로 만들어진 인스턴스를 받아올 수 있는 getProduct()라는 메시지를 인터페이스에 만들어 놓는다.

ConcreteBuilder라는 구현체를 Builder 인터페이스를 상속받아 만든다.

구현체와 인터페이스 관계이기 때문에 원한다면 인스턴스를 만드는 방법을

또 다른 ConcreteBuilder를 구현하여 추가함으로써 다른 설정으로 인스턴스를 만들 수 있는 빌더들을 구성할 수 있다.

 

빌더만 만들어서 사용할 수도 있지만 Director를 추가하여 사용할 수도 있다.

클라이언트가 직접 빌더를 사용하는 게 아니라 디렉터를 통해서 빌더를 사용하면 디렉터 안에 반복되는 빌더 호출 스택을 숨겨놓고 간단하게 사용하여 프로덕트를 받을 수 있다.

 

 

빌더 패턴을 사용하지 않고 생성자를 통해서 만들었다면 생성자에 파라미터를 장황하게 대입하여 사용하거나,

장황하게 만들어져 있는 생성자에다가 수많은 널값이나 기본값들을 대입해야 한다.

빌더는 이러한 과정을 간단하게 만들어준다.

 

 

특정 조건으로 생성하는 프로세스들이 자주 반복이 된다면 빌더를 호출하는 세트을 디렉터에 넣어놓고 재사용하는 방법을 선택하면 된다.

디렉터의 생성자에서 빌더를 주입받고 디렉터 안에서 빌더를 사용하는 방법을 미리 세팅하여 프로덕트를 생성하고,

메시지를 통해 프로덕트를 간단하게 받을 수 있다.

클라이언트는 빌더를 직접 사용하지 않고 디렉터를 통해서 가져온다.

 

 

 

빌더 패턴의 장점

1. 만들기 복잡한 객체를 순차적으로 만들 수 있다.

동일한 타입을 반환하지 않고 다음 빌더를 반환하여 다른 프로세스는 그 빌더에서 제공하는 메시지를 사용할 수 있게 만들어 주도록 한다면

설계를 잘했을 경우 순서를 강제할 수 있다.

생성자에 모든 로직을 넣기 시작하면 너무 복잡해진다.

입력 받는 값을 검증하는 코드 같은 경우 빌더에 분산 배치하여 적절한 위치에서 처리할 수 있다.

 

2. 복잡한 객체를 만드는 구체적인 과정을 숨길 수 있다.

디렉터를 사용하여 숨겨, 클라이언트는 간단한 메서드 하나로 구체적인 과정을 신경 안쓰고 사용할 수 있다.

 

3. 동일한 프로세스를 통해 다르게 구성된 객체를 만들 수 있다.

디렉터의 빌더를 교체하여 동일한 프로세스를 거치지만 VIP 용과 같이 세부적인 내용이 추가된,

기존 프로덕트를 상속받은 객체를 생성하도록 만들 수 있다.

빌더를 새로 만들어서 동일 프로세스이지만 다른 인스턴스를 생성하도록 구성하여 확장성을 꾀할 수 있다.

 

4. 불완전한 객체를 사용하지 못하도록 방지할 수 있다.

getProduct() 메서드를 반드시 호출해야만 생성한 인스턴스를 가져올 수 있다.

getProduct() 메서드 안에서 리턴하려는 인스턴스가 온전한 객체인지 확인하고 리턴하는 로직을 추가할 수 있다.

 

 

 

빌더 패턴의 단점

1. 원하는 객체를 만들려면 빌더부터 만들어야 한다.

디렉터 및 빌더를 생성하고 인스턴스를 생성할 수 있다.

객체를 조금 더 만들어야 하니까 조금이라도 성능면에서 마이너스이다.

 

2. 구조가 복잡해진다. (트레이드오프.)

디자인 패턴의 공통적인 단점.

 

 

 

 

 

 

https://refactoring.guru/ko/design-patterns/builder

 

Builder

Say you have a constructor with ten optional parameters. Calling such a beast is very inconvenient; therefore, you overload the constructor and create several shorter versions with fewer parameters. These constructors still refer to the main one, passing s

refactoring.guru