概述:
建造者模式是一种创建型设计模式,主要用于将复杂对象的构建过程与其表示分离。
可以一步一步地创建一个复杂的对象,同时允许不同的建造者创建不同的对象表示。
核心思想:
- 将一个复杂对象的构建过程拆分为多个步骤,每一步都可以定制;
- 提供一种灵活的方式来构建不同的对象,而不需要关心构建的具体实现细节。
主要用于需要创建复杂对象、需要多种表示方式的对象。
建造者模式组成:
- 产品(Product) :
- 复杂对象的最终结果
- 由多个部分组成:如部件A、部件B
- 建造者(Builder) :
- 定义创建产品各部分的抽象接口
- 具体建造者(Concrete Builder) :
- 实现建造者接口,具体定义如何构建产品的各部分
- 指挥者(Director) :
- 调用建造者的方法,根据特定步骤指导对象的构建过程
代码实现:
cpp
#include <iostream>
#include <string>
#include <memory>
using namespace std;
// 产品类(Product)
class Product {
public:
void setPartA(const string& partA) {
this->partA = partA;
}
void setPartB(const string& partB) {
this->partB = partB;
}
void show() const {
cout << "Product PartA=" << partA <<endl;
cout << "Product PartB=" << partB <<endl;
}
private:
string partA;
string partB;
};
// 抽象建造者(Builder)
class Builder {
public:
virtual ~Builder() {}
virtual void buildPartA() = 0;
virtual void buildPartB() = 0;
virtual shared_ptr<Product> getResult() = 0;
};
// 具体建造者(ConcreteBuilder)
class ConcreteBuilder : public Builder {
public:
ConcreteBuilder() {
product = make_shared<Product>();
}
void buildPartA() override {
product->setPartA("PartA");
}
void buildPartB() override {
product->setPartB("PartB");
}
shared_ptr<Product> getResult() override {
return product;
}
private:
shared_ptr<Product> product;
};
// 指挥者(Director)
class Director {
public:
explicit Director(shared_ptr<Builder> builder) : builder(builder) {}
void construct(shared_ptr<Builder> builder) {
builder->buildPartA();
builder->buildPartB();
}
private:
shared_ptr<Builder> builder;
};
int main() {
shared_ptr<Builder> builder = make_shared<ConcreteBuilder>();
Director director(builder);
director.construct(builder);
shared_ptr<Product> product = builder->getResult();
product->show();
return 0;
}
Product: 是被建造的最终产品,包含多个部分(如PartA和PartB),这些部分通常是产品的不同组成部分,最终通过建造者模式将他们组合成一个完整的产品;所以这个类只负责存储产品的组成部分,并提供一个show()方法来显示这些部分的状态。
Builder: 抽象类,定义了构建各个部分的方法(buildPartA()和buildPartB())。还定义了一个getResult()方法,返回最终构建出来的产品;抽象建造者类定义了产品构建的通用步骤,而具体建造者类将根据需求来实现这些步骤,最后返回一个完整的产品。它的作用是规范化每个具体建造者类的接口。
ConcreteBuilder: 是Builder类的具体实现,负责实现构建各个产品部分的方法。它在buildPartA()和buildPaetB()中指定了产品每个部分的具体内容。getResult()方法返回最终建造的产品;每个 ConcreteBuilder
都实现了 Builder
类的接口,具体化了产品构建的每个步骤。你可以创建不同的 ConcreteBuilder
来构建不同的产品,这使得建造过程和产品的变化是解耦的。
Director: Director
类负责指挥产品的构建过程。它使用建造者(Builder
)来按照一定的顺序和步骤构建产品。它不关心具体产品的细节,只是通过调用建造者的接口来构建产品。Director
类通过协调 Builder
类的操作,控制构建过程的顺序。它将产品的创建过程从 Client
(客户端)中抽象出来,使得客户端不必关心产品的具体构建步骤,只需要通过指挥者来构建产品。
补充说明:explicit关键字:用来修饰只有一个参数的类构造函数,以表明该构造函数是显式的,而非隐式的。当使用explicit修饰构造函数时,它将禁止类对象之间的隐式转换,以及禁止隐式调用拷贝构造函数。