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
'프로그래밍 > GoF' 카테고리의 다른 글
[생성 패턴] - 추상 팩토리(Abstract Factory) (0) | 2022.01.12 |
---|---|
[구조 패턴] - 프록시 (Proxy) (0) | 2022.01.12 |
[구조 패턴] - 플라이웨이트(Flyweight) (0) | 2022.01.12 |
[구조 패턴] - 파사드(Facade) (0) | 2022.01.11 |
[구조 패턴] - 데코레이터(Decorator) (0) | 2022.01.11 |