建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种构建对象的最佳方式。建造者模式将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式主要包含以下几个角色:
- Builder(抽象建造者):为创建一个Product对象的各个部件指定抽象接口。
- ConcreteBuilder(具体建造者):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
- Director(指挥者):构造一个使用Builder接口的对象。
- Product(产品角色):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。
建造者模式的主要优点是:
- 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更清晰。
- 允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
建造者模式适用于以下场景:
- 需要生成的对象具有复杂的内部结构。
- 需要生成的对象内部属性本身相互依赖。
以下是一个简单的C++实现的建造者模式(Builder Pattern)示例:
c
#include <iostream>
#include <string>
// 产品类
class Product {
public:
void setPartA(const std::string& partA) {
partA_ = partA;
}
void setPartB(const std::string& partB) {
partB_ = partB;
}
void show() {
std::cout << "Product contains: " << partA_ << ", " << partB_ << std::endl;
}
private:
std::string partA_;
std::string partB_;
};
// 抽象建造者类
class Builder {
public:
virtual void buildPartA() = 0;
virtual void buildPartB() = 0;
virtual Product* getProduct() = 0;
virtual ~Builder() {}
};
// 具体建造者类
class ConcreteBuilder : public Builder {
public:
ConcreteBuilder() {
product_ = new Product();
}
void buildPartA() override {
product_->setPartA("Part A");
}
void buildPartB() override {
product_->setPartB("Part B");
}
Product* getProduct() override {
return product_;
}
private:
Product* product_;
};
// 指挥者类
class Director {
public:
Director(Builder* builder) : builder_(builder) {}
void construct() {
builder_->buildPartA();
builder_->buildPartB();
}
private:
Builder* builder_;
};
int main() {
Builder* builder = new ConcreteBuilder();
Director* director = new Director(builder);
director->construct();
Product* product = builder->getProduct();
product->show();
delete director;
delete builder;
return 0;
}
在这个例子中,Product是产品类,Builder是抽象建造者类,定义了创建产品的接口。ConcreteBuilder是具体建造者类,实现了抽象建造者接口中定义的接口。
Director是指挥者类,它构造一个使用Builder接口的对象。在Director的construct接口中,调用了Builder的buildPartA和buildPartB接口。
通过这种方式,我们可以将复杂产品的创建步骤分解在不同的方法中,使得创建过程更清晰,允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。