C++에서 **빌더 패턴(Builder Pattern)**은 생성 패턴(Creational Pattern)의 한 유형으로, 복잡한 객체를 단계적으로 생성하는 데 사용됩니다. 빌더 패턴은 특히 생성 과정에서 객체를 구성하는 세부 사항이 많거나, 동일한 생성 절차로 다양한 표현을 생성해야 할 때 유용합니다. 이 패턴은 객체의 생성과 표현을 분리하여, 동일한 생성 코드에서 다양한 객체를 만들 수 있도록 설계되었습니다.
빌더 패턴의 주요 구성 요소
- Builder 인터페이스
- 객체 생성의 단계를 정의하는 추상 인터페이스입니다.
- 제품(Product)을 구성하는 여러 부분을 설정하는 메서드를 포함합니다.
- ConcreteBuilder(구체적 빌더)
- Builder 인터페이스를 구현하여 객체를 단계적으로 생성합니다.
- 완성된 제품(Product)을 반환하는 메서드도 포함합니다.
- Director(감독자)
- Builder 객체를 사용하여 객체를 생성하는 데 필요한 단계를 정의하고 실행하는 역할을 합니다.
- 객체 생성 순서를 제어하며, 빌더의 메서드를 호출하여 객체를 완성합니다.
- 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는 스포츠카를 생성하기 위한 빌더입니다.
- SportsCarBuilder는 스포츠카를 생성하기 위한 빌더입니다.
- 2단계: Director 생성 및 빌더 전달
- Director는 빌더를 받아서 객체 생성의 절차를 정의합니다.
- 3단계: 객체 생성
- Director가 빌더의 BuildEngine(), BuildWheels(), Paint() 메서드를 호출하여 객체를 단계적으로 구성합니다.
- 4단계: 완성된 객체 확인
- 완성된 Car 객체를 반환받고, 속성을 출력합니다.
- 마지막 단계: 메모리 정리
- 동적으로 생성된 객체를 명시적으로 삭제하여 메모리 누수를 방지합니다
확장 가능성
- SportsCarBuilder 외에 다른 빌더(SUVBuilder, TruckBuilder 등)를 추가하면 다양한 유형의 자동차를 생성할 수 있습니다.
- Director는 동일한 로직으로 다른 빌더를 사용할 수 있으므로, 객체 생성의 유연성이 증가합니다.
빌더 패턴의 장점
- 복잡한 객체 생성 단순화
- 객체 생성의 세부 사항을 캡슐화하여 복잡성을 줄일 수 있습니다.
- 객체 생성의 유연성 증가
- 동일한 생성 과정을 사용하여 다양한 유형의 객체를 생성할 수 있습니다.
- 객체의 생성 코드와 표현 분리
- 객체 생성에 필요한 세부 정보를 클라이언트 코드에서 분리합니다.
빌더 패턴의 단점
- 구현 복잡성 증가
- 객체를 구성하는 단계와 인터페이스를 정의해야 하므로 코드가 다소 복잡해질 수 있습니다.
- 단일 제품군에만 적합
- 동일한 생성 단계를 공유하는 제품군에는 적합하지만, 생성 방식이 크게 다른 경우에는 불편할 수 있습니다.
빌더 패턴은 주로 객체 생성이 복잡하거나 다양한 조합으로 객체를 생성해야 할 때 사용됩니다. 잘 설계된 빌더 패턴은 코드의 가독성과 재사용성을 높이는 데 매우 효과적입니다.
'Computer Programming > C,C++,MFC' 카테고리의 다른 글
[C++] 추상 팩토리 (Abstract Factory) 패턴 사용 설명 및 예제 (0) | 2024.11.20 |
---|---|
[C++] 팩토리 메서드 (Factory Method) 패턴 설명 및 사용 예제 (0) | 2024.11.15 |
[C++] 싱글턴 (Singleton) 설명 및 사용 예제 (0) | 2024.11.14 |
[C++] 디자인 패턴이란? (0) | 2024.11.12 |
[C++] C++ 에서 JSON 파싱시 오류 방지를 위한 방법 (0) | 2024.11.12 |