반응형
Builder Pattern (빌더 패턴)
목적
복잡한 객체를 생성하는 방법과 표현하는 방법을 분리한다.
즉, 생성 패턴의 결과물인 Product의 속성을 결정하는 부분과 생성하는 부분을 분리시킨다.
Product를 생성할 때 Product에 전달해야 할 파라미터가 많다면 빌더 패턴을 고려해보는게 좋다.
사용 시나리오
- Computer객체를 생성해야 하는 시스템이 있다.
- Computer객체는 각각 cpu, ram, ssd를 설정해야 하며 각각의 컴퓨터 제조사마다 스펙은 다르다.
- 각각 제조사마다 Builder를 만들고 Builder를 Director로 넘겨 Computer를 생산한다.
- 최종적으로 Client는 Director를 통해서 Product를 전달 받는다.
[Product]
class Computer {
public:
Computer() {
//set default
this->cpu = "i5";
this->ram = 8;
this->ssd = 128;
}
void setCPU(string cpu) {
this->cpu = cpu;
}
void setRAM(int ramgb) {
this->ram = ramgb;
}
void setSSD(int ssdgb) {
this->ssd = ssdgb;
}
void showSpec() {
cout<<"cpu:"<<cpu<<" ram:"<<ram<<" ssd:"<<ssd<<endl;
}
private:
string cpu;
int ram;
int ssd;
};
[Builder]
class ComputerBuilder { //abstract builder
public:
virtual void setCPU() = 0;
virtual void setRAM() = 0;
virtual void setSSD() = 0;
virtual Computer* getComputer() = 0;
};
[Concrete Builder]
class MacBuilder : public ComputerBuilder {
public:
MacBuilder() {
computer = new Computer();
}
virtual void setCPU() {
computer->setCPU("i7");
}
virtual void setRAM() {
computer->setRAM(16);
}
virtual void setSSD() {
computer->setSSD(256);
}
virtual Computer* getComputer() {
return computer;
}
private:
Computer* computer;
};
[Director]
class ComputerDirector {
public:
void setComputerBuilder(ComputerBuilder* computerBuilder) {
this->computerBuilder = computerBuilder;
}
Computer* makeComputer() {
computerBuilder->setCPU();
computerBuilder->setRAM();
computerBuilder->setSSD();
return computerBuilder->getComputer();
}
private:
ComputerBuilder* computerBuilder;
};
[사용 예]
int main(int argc, const char * argv[]) {
ComputerDirector* computerDirector = new ComputerDirector();
MacBuilder* macbuilder = new MacBuilder();
computerDirector->setComputerBuilder(macbuilder);
Computer* myCompuer = computerDirector->makeComputer();
myCompuer->showSpec();
return 0;
}
실행 결과
cpu:i7 ram:16 ssd:256
반응형
'Design Patterns > Creational Patterns' 카테고리의 다른 글
Singleton Pattern (C++) (0) | 2019.09.28 |
---|---|
Prototype Pattern (C++) (0) | 2019.09.13 |
Factory Method Pattern (C++) (0) | 2019.02.06 |
Abstract Factory Pattern (C++) (0) | 2018.11.17 |
Creational Pattern (생성 패턴) (0) | 2018.11.11 |