Design Patterns/Creational Patterns

Builder Pattern (C++)

개발새발 2019. 8. 24. 15:34
반응형

Builder Pattern (빌더 패턴)

목적

복잡한 객체를 생성하는 방법과 표현하는 방법을 분리한다.

즉, 생성 패턴의 결과물인 Product의 속성을 결정하는 부분과 생성하는 부분을 분리시킨다.

Product를 생성할 때 Product에 전달해야 할 파라미터가 많다면 빌더 패턴을 고려해보는게 좋다.

 

출처 wikipedia

사용 시나리오

  • 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

반응형