Builder_Pattern - 8BitsCoding/RobotMentor GitHub Wiki

μ •μ˜

λ³΅μž‘ν•œ 단계가 ν•„μš”ν•œ μΈμŠ€ν„΄μŠ€ 생성을 λΉŒλ” νŒ¨ν„΄μ„ ν†΅ν•΄μ„œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

λ³΅μž‘ν•œ 단계λ₯Ό 거쳐야 μƒμ„±λ˜λŠ” 객체의 κ΅¬ν˜„μ„ μ„œλΈŒ ν΄λž˜μŠ€μ—κ²Œ λ„˜κ²¨μ£ΌλŠ” νŒ¨ν„΄


μ˜ˆμ‹œλ‘œ μ„€λͺ…

class Computer {
private:
    string cpu;
    string gpu;
    string memory;

public:
    Computer(string _cpu, string _gpu, string _memory) {cpu = _cpu; gpu = _gpu; memory = _memory;}
    void setCPU(string _cpu) { cpu = _cpu; }
    void setGPU(string _gpu) { gpu = _gpu; }
    void setMEMORY(string _memory) { memory = _memory; }
    string getCPU() {return cpu;}
    string getGPU() {return gpu;}
    string getMEMORY() {return memory;}

    string printComputer() {
        return cpu + gpu + memory;
    }
}
int main() {
    Computer * cp = new Computer("i7", "1060", "16G");
    printf("%s \n", cp->printComputer());
}

ν•˜μ§€λ§Œ μ»΄ν“¨ν„°μ˜ μ„±λŠ₯이 변경될 μ‹œ mainν•¨μˆ˜μ—μ„œ 항상 new Computer("i7" ... 이 뢀뢄을 λ³€κ²½ν•΄μ€˜μ•Ό ν•˜λ‚˜?? 해결책은 μ—†λŠ”κ°€?

// λ‹€μŒκ³Ό 같이 μ„ μ–Έμ‹œ μ’€ 더 κΉ”λ”ν•˜κ²Œ μ„ μ–Έκ°€λŠ₯.
int main() {
    ComputerFactory * factory = new ComputerFactory());
    factory->setBlueprint(new LGgramBluePrint());
    Computer * cp = factory->makeAndget();

    // mainμ—μ„œ μˆ˜μ •ν•˜λŠ” κ²ƒμ΄μ•„λ‹ˆλΌ factoryμ˜€λΈŒμ νŠΈμ—μ„œ λ””ν…ŒμΌν•œ 사항을 μˆ˜μ •ν•œλ‹€.
}

κ·Έλ ‡λ‹€λ©΄ Factory ν΄λž˜μŠ€λŠ” μ–΄λ–»κ²Œ κ΅¬μ„±ν• κΉŒ?

class BluePrint {
public:
    virtual void setCpu();
    virtual void setMemory();
    virtual void setGpu();
};

class LGgramBluePrint : public BluePrint {
public:
    // κ΅¬ν˜„
    void setCpu();
    void setMemory();
    void setGpu();
private:
    Computer* computer;
}

μ’€ 더 ν˜„μ‹€μ μΈ λΉŒλ” νŒ¨ν„΄ μ‚¬μš© 예제

int main() {

    // μš°μ„  λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” μ•„λž˜μ™€ 같은 μ‹€μˆ˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€.
    Computer * cp = new Computer("i7", "", "16G");
    // mainμ—μ„œ λͺ¨λ‘ 관리할 μ‹œ μ‹€μˆ˜κ°€ λ‚˜μ˜€κΈ° 마련

    Computer * cp = new ComputerBuilder();
    cp->start();
    cp->setCpu("i7");
    cp->setRam("16G");
    cp->Storage("256ssd")
    cp->build();
    // λ‹€μŒκ³Ό 같이 ν•˜κ³  μ‹Άλ‹€

    return 0;
}
class ComputerBuilder {
private:
    Computer * computer;
    ComputerBuilder() {
        computer = new Computer("default", "default", "default");
    }

public:
    static ComputerBuilder start() {
        return new ComputerBuilder();
    }

    // getter, setter
}

μ°Έκ³ μ‚¬μ΄νŠΈ