반응형

C++에서 **빌더 패턴(Builder Pattern)**은 생성 패턴(Creational Pattern)의 한 유형으로, 복잡한 객체를 단계적으로 생성하는 데 사용됩니다. 빌더 패턴은 특히 생성 과정에서 객체를 구성하는 세부 사항이 많거나, 동일한 생성 절차로 다양한 표현을 생성해야 할 때 유용합니다. 이 패턴은 객체의 생성과 표현을 분리하여, 동일한 생성 코드에서 다양한 객체를 만들 수 있도록 설계되었습니다.


빌더 패턴의 주요 구성 요소

  1. Builder 인터페이스
    • 객체 생성의 단계를 정의하는 추상 인터페이스입니다.
    • 제품(Product)을 구성하는 여러 부분을 설정하는 메서드를 포함합니다.
  2. ConcreteBuilder(구체적 빌더)
    • Builder 인터페이스를 구현하여 객체를 단계적으로 생성합니다.
    • 완성된 제품(Product)을 반환하는 메서드도 포함합니다.
  3. Director(감독자)
    • Builder 객체를 사용하여 객체를 생성하는 데 필요한 단계를 정의하고 실행하는 역할을 합니다.
    • 객체 생성 순서를 제어하며, 빌더의 메서드를 호출하여 객체를 완성합니다.
  4. Product(제품)
    • 생성되는 최종 객체입니다.
    • 복잡한 구조를 가지며, 빌더에 의해 단계적으로 생성됩니다.

C++ 구현 예제

다음은 간단한 예제로, 빌더 패턴을 사용하여 복잡한 Car 객체를 생성하는 경우를 보여줍니다.

1. Product 클래스

 

  • 역할
    Car는 최종적으로 생성되는 객체입니다.
    여기에는 자동차의 엔진, 바퀴, 색상 등 여러 속성이 정의되어 있습니다.
  • 특징
    ShowSpecifications() 메서드를 통해 생성된 객체의 속성을 확인할 수 있습니다.

 


2. Builder 인터페이스

 

 

  • 역할
    Builder 인터페이스는 Car 객체를 구성하기 위한 구성 단계를 정의합니다.
  • 주요 메서드
    • BuildEngine(): 엔진 설정.
    • BuildWheels(): 바퀴 설정.
    • Paint(): 자동차 색상 설정.
    • GetCar(): 최종적으로 완성된 Car 객체를 반환.
  • 특징
    이 인터페이스를 구현하는 구체적 빌더는 Car의 속성을 단계별로 설정합니다.

 


3. ConcreteBuilder

 

  • 역할
    SportsCarBuilder는 CarBuilder를 구현하여 스포츠카를 단계적으로 생성합니다.
  • 구성 단계
    • BuildEngine(): Car의 engine 속성을 "V8 Engine"으로 설정.
    • BuildWheels(): wheels 속성을 "18 inch Alloy Wheels"로 설정.
    • Paint(): color 속성을 "Red"로 설정.
  • 특징
    • Car* car: 생성 중인 Car 객체를 저장.
    • 객체 생성이 끝나면 GetCar() 메서드를 통해 완성된 객체를 반환합니다.

 


4. Director 클래스

 

  • 역할
    Director는 빌더를 사용하여 Car를 생성하는 순서를 정의합니다.
  • 특징
    • CarBuilder* builder: 사용할 빌더 객체를 보관.
    • Construct(): 빌더의 메서드를 호출하여 객체 생성 과정을 실행.
  • 장점
    • 빌더가 Director와 협력하므로, 객체 생성의 순서와 논리를 분리할 수 있습니다.
    • 동일한 Director를 사용하더라도 다른 ConcreteBuilder를 전달하면 다양한 객체를 생성할 수 있습니다.

 


5. 클라이언트 코드

  • 1단계: 빌더 생성  
    • SportsCarBuilder는 스포츠카를 생성하기 위한 빌더입니다.
       
  • 2단계: Director 생성 및 빌더 전달
    • Director는 빌더를 받아서 객체 생성의 절차를 정의합니다.
  • 3단계: 객체 생성
    • Director가 빌더의 BuildEngine(), BuildWheels(), Paint() 메서드를 호출하여 객체를 단계적으로 구성합니다.
  • 4단계: 완성된 객체 확인
    • 완성된 Car 객체를 반환받고, 속성을 출력합니다.
  • 마지막 단계: 메모리 정리
    • 동적으로 생성된 객체를 명시적으로 삭제하여 메모리 누수를 방지합니다

확장 가능성

  • SportsCarBuilder 외에 다른 빌더(SUVBuilder, TruckBuilder 등)를 추가하면 다양한 유형의 자동차를 생성할 수 있습니다.
  • Director는 동일한 로직으로 다른 빌더를 사용할 수 있으므로, 객체 생성의 유연성이 증가합니다.

빌더 패턴의 장점

  1. 복잡한 객체 생성 단순화
    • 객체 생성의 세부 사항을 캡슐화하여 복잡성을 줄일 수 있습니다.
  2. 객체 생성의 유연성 증가
    • 동일한 생성 과정을 사용하여 다양한 유형의 객체를 생성할 수 있습니다.
  3. 객체의 생성 코드와 표현 분리
    • 객체 생성에 필요한 세부 정보를 클라이언트 코드에서 분리합니다.

빌더 패턴의 단점

  1. 구현 복잡성 증가
    • 객체를 구성하는 단계와 인터페이스를 정의해야 하므로 코드가 다소 복잡해질 수 있습니다.
  2. 단일 제품군에만 적합
    • 동일한 생성 단계를 공유하는 제품군에는 적합하지만, 생성 방식이 크게 다른 경우에는 불편할 수 있습니다.

빌더 패턴은 주로 객체 생성이 복잡하거나 다양한 조합으로 객체를 생성해야 할 때 사용됩니다. 잘 설계된 빌더 패턴은 코드의 가독성과 재사용성을 높이는 데 매우 효과적입니다.

+ Recent posts