본문 바로가기
공부/Object-Oriented Design Pattern

Builder Pattern 빌더 패턴이란

by 혼밥맨 2021. 6. 1.
반응형

Builder Pattern 빌더 패턴이란

 

Builder Pattern는 복잡한 객체를 단계별로 작성할 수 있는 작성 설계 패턴입니다. 패턴을 사용하면 동일한 구조 코드를 사용하여 객체의 다양한 유형과 표현을 생성할 수 있습니다.

 

문제점

많은 필드와 중첩된 오브젝트의 단계적 초기화가 필요한 복잡한 오브젝트를 상상해 보십시오. 이러한 초기화 코드는 일반적으로 많은 매개 변수를 가진 괴물 생성자 (Constructor) 안에 묻힌다. 더 나쁜 것은 클라이언트 코드 전체에 흩어져 있다는 것입니다.

 

예를 들어, House 개체를 만드는 방법에 대해 생각해 봅시다. 간단한 집을 짓기 위해서는 4개의 벽과 바닥을 만들고, 문을 설치하고, 창문을 맞추고, 지붕을 지어야 한다. 하지만, 만약 여러분이 더 크고 밝은 집, 뒤뜰과 다른 좋은 집(예: 난방 시스템, 배관, 전기 배선)을 원한다면 어떨까요?

가장 간단한 해결책은 "기본 House" 클래스를 확장하고 모든 매개 변수 조합을 포괄하는 하위 클래스 집합을 만드는 것입니다. 하지만 결국에는 상당한 수의 하위 클래스가 생성될 것입니다. 베란다 스타일과 같은 모든 새로운 매개변수는 이 계층을 더욱 증가시켜야 합니다.

하위 계급을 키우지 않는 또 다른 방법이 있습니다. House 객체를 제어하는 가능한 모든 매개 변수를 사용하여 기본 하우스 클래스에 바로 거대 생성자를 생성할 수 있습니다. 이러한 접근 방식은 하위 클래스의 필요성을 없애주지만, 또 다른 문제가 발생합니다.

 

그 문제는 "대부분의 경우 매개 변수의 대부분은 사용되지 않으므로 생성자 호출이 상당히 어렵습니다". 예를 들어, 수영장이 있는 집은 극히 일부에 불과하기 때문에 수영장과 관련된 매개변수는 10개 중 9개가 무용지물이 될 것이다. (많이 안 쓰이는 parameter와 constructor가 생길 것이고, 그것은 constructor가 못 생긴 것처럼 보이게 만든다.)

 

 

해결책

Builder Pattern은 오브젝트 작성 코드를 자체 클래스에서 추출하여 Builder라는 개별 오브젝트로 이동하도록 제안합니다.

 

Builder Pattern은 객체 구조를 일련의 단계(buildWalls, buildDoor 등)로 구성합니다. 개체를 만들려면 builder object에서 이러한 단계를 일련의 실행합니다. 중요한 점은 모든 단계를 호출할 필요가 없다는 것입니다. 개체의 특정 구성을 생성하는 데 필요한 단계만 호출할 수 있습니다.

제품의 다양한 표현을 빌드해야 하는 경우 일부 구성 단계에서 다른 구현이 필요할 수 있습니다. 예를 들어, 오두막집의 벽은 나무로 지어질 수 있지만, 성벽은 돌로 지어져야 한다.

이 경우 동일한 빌드 단계 집합을 구현하지만 다른 방식으로 구현하는 여러 다른 builder class를 만들 수 있습니다. 그런 다음 이러한 builder를 construction process (즉, 빌딩 스텝에 대한 주문 콜 집합)에 사용하여 다양한 종류의 객체를 생성할 수 있습니다.

 

 

 

Director

더 나아가 제품을 구성하는 데 사용하는 빌더 단계에 대한 일련의 호출을 Director라는 별도의 클래스로 추출할 수 있습니다. Director class는 작성자가 해당 단계에 대한 구현을 제공하는 동안, Builder Class는 빌딩 단계를 실행할 순서를 정의합니다.

당신의 프로그램에서 감독 수업을 꼭 들어야 하는 것은 아닙니다. 클라이언트 코드에서 직접 특정 순서로 building steps를 호출할 수 있습니다. 그러나, 감독 클래스는 프로그램 전체에 걸쳐 재사용할 수 있도록 다양한 구성 루틴을 배치하기에 좋은 장소일 수 있습니다.

또한 Director Class는 클라이언트 코드에서 제품 구조의 세부 사항을 완전히 숨깁니다. 클라이언트는 작성자를 디렉터와 연결하고, 작성자와 구성을 시작하고, 작성자로부터 결과를 얻기만 하면 됩니다.

 

 

적용

1) 10개의 선택적 매개 변수를 가진 생성자가 있다고 가정합니다. 이렇게 optional constructor가 많은 것을 호출하는 것은 매우 불편하기 때문에 생성자를 오버로드하고 더 적은 매개 변수로 여러 개의 더 짧은 버전을 만들 수 있습니다. 이러한 constructor는 일부 기본값을 생략된 모수에 전달하면서 여전히 주 생성자를 참조합니다.

 

2) 코드가 한 제품/기능을 여러 방법으로 다르게 표현(예: 돌과 나무 집)하고 싶다면 Builder Pattern을 사용하십시오. 

 

Builder Pattern은 제품의 다양한 표현 구성 시 세부 사항만 다른 유사한 단계가 포함될 때 적용될 수 있습니다.

Base Builder Interface는 가능한 all possible construction steps를 정의하며, concrete builders는 제품의 특정 표현을 구성하기 위해 이러한 단계를 구현한다. 한편, director class은 the order of construction를 안내한다.

 

 

장점

개체를 단계별로 구성하거나, 생성 단계를 연기하거나, 단계를 반복적으로 실행할 수 있습니다.

제품의 다양한 표현을 작성할 때 동일한 시공 코드를 재사용할 수 있습니다.

Single Responsibility Principle(단일 책임 원칙). 제품의 비즈니스 논리로부터 복잡한 구성 코드를 분리할 수 있습니다.

 

단점

패턴에 여러 개의 새 클래스를 만들어야 하므로 코드의 전체적인 복잡성은 증가합니다.

 

 

 

반응형

댓글