建造者模式(Builder)
建造者模式是一种创建型设计模式,用于构造复杂对象。它允许将一个复杂对象的构建过程分解成多个步骤,并通过建造者的不同实现来创建不同的对象。建造者模式特别适用于需要创建复杂产品的场景,这些产品可能由多个组件组成。
1. 建造者模式的结构
建造者模式包含以下几个主要组件:
- Builder(建造者): 定义了构建产品的各个步骤,并提供一个方法来获取构建好的产品。
- ConcreteBuilder(具体建造者): 实现了
Builder
接口,具体构建各个部件并定义如何组装产品。 - Product(产品): 由建造者构建的复杂对象,通常包括多个部件。
- Director(指挥者): 负责控制建造过程,调用建造者的步骤来创建一个完整的产品。
2. Mermaid 关系图
以下是建造者模式的类图,用 Mermaid 表示:
classDiagram class Builder { <<abstract>> + buildPartA() : void + buildPartB() : void + getResult() : Product } class ConcreteBuilder { + buildPartA() : void + buildPartB() : void + getResult() : Product } class Product { + partA : string + partB : string + show() : void } class Director { + construct() : void + setBuilder(b : Builder) : void } Builder <|-- ConcreteBuilder ConcreteBuilder --> Product : "构建" Director --> Builder : "使用" ConcreteBuilder --> Product : "获取"
3. 建造者模式的实现
Builder 抽象建造者类:
class Builder {
public:
virtual ~Builder() = default;
virtual void buildPartA() = 0;
virtual void buildPartB() = 0;
virtual Product* getResult() = 0;
};
ConcreteBuilder 具体建造者类:
class ConcreteBuilder : public Builder {
private:
Product* product;
public:
ConcreteBuilder() {
this->reset();
}
~ConcreteBuilder() {
delete product;
}
void reset() {
this->product = new Product();
}
void buildPartA() override {
this->product->partA = "PartA";
}
void buildPartB() override {
this->product->partB = "PartB";
}
Product* getResult() override {
Product* result = this->product;
this->reset();
return result;
}
};
Product 复杂产品类:
class Product {
public:
std::string partA;
std::string partB;
void show() const {
std::cout << "Product Parts: " << partA << ", " << partB << std::endl;
}
};
Director 指挥者类:
class Director {
private:
Builder* builder;
public:
void setBuilder(Builder* builder) {
this->builder = builder;
}
void construct() {
this->builder->buildPartA();
this->builder->buildPartB();
}
};
4. 使用建造者模式
在客户端代码中,可以使用指挥者来控制建造过程,通过建造者来获取最终的产品。示例:
int main() {
ConcreteBuilder* builder = new ConcreteBuilder();
Director director;
director.setBuilder(builder);
director.construct();
Product* product = builder->getResult();
product->show();
delete product;
delete builder;
return 0;
}
5. 总结
建造者模式通过将对象的构建过程与表示分离,使得创建复杂对象的过程更加灵活和可控。Mermaid 类图清晰地展示了建造者、具体建造者、指挥者和产品之间的关系,有助于理解该模式的实现和应用场景。