프로그래밍/GoF

[생성 패턴] - 빌더(Builder)

MAKGA 2022. 1. 12. 10:25
320x100

구조

#pragma once

#include <iostream>
#include <string>

class ISubject
{
public:
    virtual void Operation() = 0;
    virtual void SetName(std::string& name) = 0;
};

class Subject : public ISubject
{
public:
    void Operation() override
    {
        std::cout << "Operating " << name_ << std::endl;
    }

    void SetName(std::string& name) override
    {
        name_ = name;
    }

private:
    std::string name_;
};

class IBuilder
{
public:
    ISubject* GetSubject() { return subject_; }
    virtual IBuilder* BuildSubject() = 0;
    virtual IBuilder* SetName(std::string name) = 0;

protected:
    ISubject* subject_;
};

class Builder : public IBuilder
{
public:
    IBuilder* BuildSubject()
    {
        subject_ = new Subject();
        return this;
    }

    IBuilder* SetName(std::string name)
    {
        subject_->SetName(name);
        return this;
    }
};

 

사용

int main()
{
    IBuilder* builder = new Builder;
    builder->BuildSubject()->SetName("SubjectA");

    ISubject* subject = builder->GetSubject();
    subject->Operation();

    system("pause");
    return 0;
}

생성자를 통해 객체(Subject)를 직접 생성하는 대신에, 빌더 객체(Builder)가 객체의 생성을 대신 수행하게 된다. 그리고, 클라이언트가 빌더 객체의 인터페이스를 통해 변수를 객체에게 차례로 전달하여 (객체를 건설=Build 하는 모습으로 표현된다) 객체의 초기 설정을 진행하며, 최종적으로 완성된 객체를 빌더 객체로부터 전달 받을 수 있다.

빌더 패턴을 이용해 다른 방법으로 객체를 생성하게 되면, 객체의 생성에 대한 기능을 캡슐화할 수 있고, 클라이언트가 원하는 매개변수만 객체에 차례로 입력할 수 있게 된다. 하지만, 객체를 생성하기 위해 변형 가능한 빌더 클래스를 정의해야 하고, 빌더 패턴을 통해 생성된 객체는 무결성이 보장되지 않는다.

 

 

320x100