Computer类定义
首先定义Computer
类,它包含了一些基本组件:
class Computer {
public:
void setCPU(const QString &cpu) { this->cpu = cpu; }
void setRAM(const QString &ram) { this->ram = ram; }
void setHardDisk(const QString &hardDisk) { this->hardDisk = hardDisk; }
QString getConfiguration() const {
return "CPU: " + cpu + ", RAM: " + ram + ", Hard Disk: " + hardDisk;
}
private:
QString cpu;
QString ram;
QString hardDisk;
};
ComputerBuilder类定义
接下来,定义ComputerBuilder
抽象类,它声明了构建Computer
所需的步骤:
class ComputerBuilder {
public:
virtual ~ComputerBuilder() {}
Computer* getComputer() { return computer; }
void createNewComputer() { computer = new Computer(); }
virtual void buildCPU() = 0;
virtual void buildRAM() = 0;
virtual void buildHardDisk() = 0;
protected:
Computer* computer;
};
具体建造者类
然后,创建具体的建造者类,如GamingComputerBuilder
,它实现了ComputerBuilder
中定义的抽象方法:
class GamingComputerBuilder : public ComputerBuilder {
public:
void buildCPU() override { computer->setCPU("High-end CPU"); }
void buildRAM() override { computer->setRAM("16GB"); }
void buildHardDisk() override { computer->setHardDisk("1TB SSD"); }
};
Director类
最后,创建一个Director
类,它负责管理建造过程:
class Director {
public:
void setComputerBuilder(ComputerBuilder* builder) { this->builder = builder; }
Computer* getComputer() {
return builder->getComputer();
}
void constructComputer() {
builder->createNewComputer();
builder->buildCPU();
builder->buildRAM();
builder->buildHardDisk();
}
private:
ComputerBuilder* builder;
};
使用示例
使用这些类来构建一个计算机对象:
int main() {
Director director;
GamingComputerBuilder builder;
director.setComputerBuilder(&builder);
director.constructComputer();
Computer* computer = director.getComputer();
qDebug() << computer->getConfiguration();
delete computer;
return 0;
}
代码分析
总的来说,通过使用建造者模式,代码结构更加清晰,扩展性和灵活性提高,同时也使得构建复杂对象的过程更加容易管理和维护。
-
Computer类:这个类代表了复杂对象(在此例中是计算机)。它包含了几个基本部件(CPU、RAM、硬盘),以及一个方法
getConfiguration
用于返回构建好的计算机的配置信息。 -
ComputerBuilder抽象类:这是一个抽象基类,定义了构建
Computer
对象所需的步骤。它包含了一个指向Computer
对象的指针,并提供了创建新Computer
对象的方法createNewComputer
。此外,它定义了几个纯虚函数(buildCPU
、buildRAM
、buildHardDisk
),这些函数在具体的建造者类中实现。 -
具体建造者类(如GamingComputerBuilder):这些类继承自
ComputerBuilder
并实现了其抽象方法。每个具体建造者类都会以不同的方式构建Computer
的各个部分,例如GamingComputerBuilder
提供了高性能的CPU和大容量的RAM。 -
Director类:这个类负责指导构建过程。它持有一个
ComputerBuilder
对象的引用,并通过这个引用来调用建造步骤。最后,Director
提供了一个方法getComputer
来获取最终构建的Computer
对象。优点
-
分离构建复杂对象的过程和表示:建造者模式将一个复杂对象的构建(即
Computer
对象)与其表示分离。这使得同样的构建过程可以创建不同的表示。 -
更好的可扩展性和灵活性:可以很容易地添加新的
ComputerBuilder
子类来构建不同类型的Computer
对象,无需修改现有代码。这符合开闭原则,使系统更容易扩展和维护。 -
更清晰的业务逻辑:由于构建过程被封装在Director类中,使用者只需与Director交互就能构建对象,无需关心构建的细节,使得业务逻辑更加清晰。
-
逐步构建:建造者模式允许对象的逐步构建。在某些场景下,这种逐步构建是非常必要的,特别是当构建过程复杂或者构建步骤需要顺序执行时。
-
更好的控制构建过程:Director类的引入提供了对构建过程的更好控制。可以在Director中定义复杂的构建顺序逻辑,使得构建过程更加灵活。