C++建造者模式
意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用性
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
- 当构造过程必须允许被构造的对象有不同的表示时
示意性代码
- 产品类
class Computer {
private:
string _cpu; // 必须
string _ram; // 必须
int _usbCount; // 可选
string _keyboard; // 可选
string _display; // 可选
public:
Computer(string cpu, string ram) : _cpu(cpu), _ram(ram) { }
void setUsbCount(int usbCount) {
this->_usbCount = usbCount;
}
void setKeyboard(string keyboard) {
this->_keyboard = keyboard;
}
void setDisplay(string display) {
this->_display = display;
}
void show() {
cout << "{\n" << " cpu : " << _cpu << endl
<< " ram : " << _ram << endl << " keyboard : " << _keyboard
<< endl << " display : " << _display << endl
<< "}\n";
}
- 抽象构建者类
class ComputerBuilder {
public:
virtual void setUsbCount() = 0;
virtual void setKeyboard() = 0;
virtual void setDisplay() = 0;
virtual Computer getComputer() = 0;
virtual ~ComputerBuilder() { }
};
- 苹果电脑构建者类
class MacComputerBuilder : public ComputerBuilder {
private:
Computer* _computer;
public:
MacComputerBuilder(string cpu, string ram) {
_computer = new Computer(cpu, ram);
}
~MacComputerBuilder() override {
delete _computer;
}
void setUsbCount() override {
_computer->setUsbCount(2);
}
void setKeyboard() override {
_computer->setKeyboard("苹果键盘");
}
void setDisplay() override {
_computer->setDisplay("苹果显示器");
}
Computer* getComputer() override {
return _computer;
}
};
- 联想电脑构建者类
class LenovoComputerBuilder : public ComputerBuilder {
private:
Computer* _computer;
public:
LenovoComputerBuilder(string cpu, string ram) {
_computer = new Computer(cpu, ram);
}
~LenovoComputerBuilder() override {
delete _computer;
}
void setUsbCount() override {
_computer->setUsbCount(4);
}
void setKeyboard() override {
_computer->setKeyboard("联想键盘");
}
void setDisplay() override {
_computer->setDisplay("联想显示器");
}
Computer* getComputer() override {
return _computer;
}
};
- 指导者类
class ComputerDirector {
public:
void makeComputer(ComputerBuilder* builder) {
builder->setUsbCount();
builder->setDisplay();
builder->setKeyboard();
}
};
- 使用
int main() {
ComputerDirector* director = new ComputerDirector();
ComputerBuilder* builder = new MacComputerBuilder("I5处理器", "三星125");
director->makeComputer(builder);
Computer* macComputer = builder->getComputer();
cout << "mac computer : ";
macComputer->show();
ComputerBuilder* lenovoBuilder = new LenovoComputerBuilder("I7处理器", "海力士222");
director->makeComputer(lenovoBuilder);
Computer* lenovoComputer = lenovoBuilder->getComputer();
cout << "lenovo computer";
lenovoComputer->show();
}