[디자인패턴] 생성패턴(4) - Builder Pattern (빌더 패턴)

Study/Software Architecture · 2023. 5. 18. 15:46

디자인 패턴 총정리 시리즈의 네 번째 패턴은 Builder Pattern입니다.

1. 개요

Builder Pattern은 객체의 생성과 표현을 분리하는 creation 설계 패턴입니다. 동일한 creation  설계 프로세스를 사용해서 객체에 다양한 변화를 만들어 줄 수 있습니다. 해당 패턴은 여러 선택/필수 파라미터를 포함한 복잡한 초기화 절차를 가진 객체를 처리할 때 유용하게 사용될 수 있습니다.

2. 예시 - Car Factory

생상, 시트, 엔진 타입, GPS 유무 등 다양한 옵션 파라미터를 선택해 차량 객체를 생성해야 하는 예시를 들어보겠습니다.

다수의 파라미터를 가지거나 다수의 오버로딩을 하고 있는 생성자를 가지는 대신, Builder 패턴을 사용해서 객체 생성 프로세스를 간소화할 수 있습니다.

 

우선 Car 클래스를 정의합니다. 해당 클래스는 우리가 생성하기 원하는 객체를 대표해줍니다.

class Car {
public:
    void setColor(const std::string& color) { /* Set the car's color */ }
    void setSeats(int seats) { /* Set the number of seats */ }
    void setEngineType(const std::string& engineType) { /* Set the engine type */ }
    void setGPS(bool hasGPS) { /* Set GPS availability */ }

    // Additional methods and functionality of the Car class
    // ...
};

 

그다음 Car 객체 생성에 대한 책임이 분리된 CarBuilder 클래스를 생성합니다.

class CarBuilder {
private:
    Car car;

public:
    void setColor(const std::string& color) {
        car.setColor(color);
    }

    void setSeats(int seats) {
        car.setSeats(seats);
    }

    void setEngineType(const std::string& engineType) {
        car.setEngineType(engineType);
    }

    void setGPS(bool hasGPS) {
        car.setGPS(hasGPS);
    }

    Car build() {
        return car;
    }
};

 

CarBuilder 클래스는 단계적인 생성 절차를 캡슐화합니다. 해당 클래스는 색상, 시트, 엔진유형, GPS 등 Car 객체의 개별 속성을 설정하는 메서드를 제공하고, build() 메서드는 완전히 설정된 car 객체를 반환합니다.

 

이와 같이 Builder 패턴을 사용하면, 다양한 설정으로 car 객체를 구성할 수 있습니다.

Car buildCar() {
    CarBuilder builder;
    builder.setColor("Red");
    builder.setSeats(4);
    builder.setEngineType("V8");
    builder.setGPS(true);
    return builder.build();
}

Car myCar = buildCar();

 

 

이처럼 Builder 패턴을 이용하면 다수의 생성자나 생성자 오버로딩을 사용하여 구성을 복잡하게 하지 않고 원하는 객체를 쉽게 구성할 수 있습니다.

 

3. 장점

Improved Readability: Builder 패턴은 복잡한 구성의 객체를 구축하기 위한 보다 자연스럽고 가독성 있는 API를 제공하여 코드를 보다 읽기 쉽게 만들고 유지 보수성을 높여줍니다.

Flexible Object: Builder 패턴을 사용하면 다른 속성을 선택하고 설정하는 것과 같은 객체 변형을 쉽게 생성할 수 있어 유연성이 향상됩니다.

Encapsulated Construction Logic: 생성 로직이 Builder 클래스 내로 캡슐화되어 객체 생성 프로세스를 추상화하고 모듈화를 높일 수 있습니다.

 

4. 단점

Increased Code Complexity: Builder 패턴을 구현하기 위해선 추가적인 Builder 패턴을 만들어야 하기 때문에 코드 복잡도가 올라갈 수 있습니다.

Overhead: Builder 패턴에서는 추가적인 추상 레이어가 도입되어 오버헤드가 약간 발생할 수 있지만, 무시 가능한 수준입니다.

 

5. 결론

Builder Pattern은 복잡한 객체의 생성을 유연하고 가독성 있는 방법으로 간소화할 수 있는 도구입니다. Builder Pattern은 객체 생성 로직을 객체 자체로부터 분리함으로써 코드 구성, 유지보수성, 재사용성을 향상합니다.

반응형