C++设计模式:建造者模式
设计模式是软件开发中用来解决常见问题的典型解决方案。建造者模式(Builder Pattern)是一种创建型设计模式,它通过分步骤构建复杂对象,使对象的创建过程更加清晰和灵活。本文将介绍建造者模式的基本概念、结构、优缺点以及如何在C++中实现。
什么是建造者模式?
建造者模式是一种将复杂对象的构建与其表示分离的设计模式。通过使用不同的建造者,可以创建具有不同表示的对象。它主要用于创建一些复杂对象,这些对象由多个部分组成,而这多个部分通常需要分步骤创建。
建造者模式主要由以下几个部分组成:
- 产品(Product)
- 需要构建的复杂对象。
- 建造者(Builder)
- 构建产品的各个部分的抽象接口。
- 具体建造者(ConcreteBuilder)
- 实现Builder接口,构建和装配各个部件。
- 指挥者(Director)
- 构建一个使用Builder接口的对象。
建造者模式的优缺点
优点:
- 封装性:将复杂对象的创建过程封装起来,客户端不需要知道具体的创建细节。
- 可扩展性:通过引入新的具体建造者,可以创建不同的产品对象,扩展性强。
- 细粒度控制:允许逐步构建复杂对象,可以更精细地控制对象的创建过程。
缺点:
- 复杂性增加:引入多个Builder和Director类,可能会增加系统的复杂性。
- 构建过程固定:如果产品的构建过程发生变化,需要修改相应的Builder类。
在C++中实现建造者模式
下面是一个使用建造者模式创建复杂对象的示例。假设我们要创建一个包含多个部件的计算机对象。
uses Computer -cpu_ : std::string -gpu_ : std::string -ram_ : std::string -storage_ : std::string +setCPU(std::string cpu) +setGPU(std::string gpu) +setRAM(std::string ram) +setStorage(std::string storage) +show() : const <<interface>> Builder +buildCPU() : void +buildGPU() : void +buildRAM() : void +buildStorage() : void +getResult() GamingComputerBuilder -computer_ : Computer* +buildCPU() : void +buildGPU() : void +buildRAM() : void +buildStorage() : void +getResult() Director -builder_ : Builder* +setBuilder(Builder* builder) +construct()
cpp
#include <iostream>
#include <string>
// 产品类
class Computer {
public:
void setCPU(const std::string& cpu) { cpu_ = cpu; }
void setGPU(const std::string& gpu) { gpu_ = gpu; }
void setRAM(const std::string& ram) { ram_ = ram; }
void setStorage(const std::string& storage) { storage_ = storage; }
void show() const {
std::cout << "CPU: " << cpu_ << "\n"
<< "GPU: " << gpu_ << "\n"
<< "RAM: " << ram_ << "\n"
<< "Storage: " << storage_ << std::endl;
}
private:
std::string cpu_;
std::string gpu_;
std::string ram_;
std::string storage_;
};
// 抽象建造者
class Builder {
public:
virtual ~Builder() = default;
virtual void buildCPU() = 0;
virtual void buildGPU() = 0;
virtual void buildRAM() = 0;
virtual void buildStorage() = 0;
virtual Computer* getResult() = 0;
};
// 具体建造者
class GamingComputerBuilder : public Builder {
public:
GamingComputerBuilder() { computer_ = new Computer(); }
~GamingComputerBuilder() { delete computer_; }
void buildCPU() override { computer_->setCPU("Intel i9"); }
void buildGPU() override { computer_->setGPU("NVIDIA RTX 4080"); }
void buildRAM() override { computer_->setRAM("32GB"); }
void buildStorage() override { computer_->setStorage("1TB SSD"); }
Computer* getResult() override { return computer_; }
private:
Computer* computer_;
};
// 指挥者
class Director {
public:
void setBuilder(Builder* builder) { builder_ = builder; }
Computer* construct() {
builder_->buildCPU();
builder_->buildGPU();
builder_->buildRAM();
builder_->buildStorage();
return builder_->getResult();
}
private:
Builder* builder_;
};
int main() {
Director director;
GamingComputerBuilder gamingBuilder;
director.setBuilder(&gamingBuilder);
Computer* gamingComputer = director.construct();
gamingComputer->show();
delete gamingComputer;
return 0;
}
总结
建造者模式通过将复杂对象的创建过程分解为多个步骤,使得构建过程更加清晰和灵活。在C++中实现建造者模式,可以通过定义一个抽象建造者接口和多个具体建造者类,结合指挥者类来完成复杂对象的构建。通过使用建造者模式,可以提高代码的可读性和可维护性,并且便于扩展新的构建需求。