设计模式——建造者模式

概述:

建造者模式是一种创建型设计模式,主要用于将复杂对象的构建过程与其表示分离。

可以一步一步地创建一个复杂的对象,同时允许不同的建造者创建不同的对象表示。

核心思想:

  • 将一个复杂对象的构建过程拆分为多个步骤,每一步都可以定制;
  • 提供一种灵活的方式来构建不同的对象,而不需要关心构建的具体实现细节。

主要用于需要创建复杂对象、需要多种表示方式的对象。

建造者模式组成:

  1. 产品(Product)
    1. 复杂对象的最终结果
    2. 由多个部分组成:如部件A、部件B
  2. 建造者(Builder)
    1. 定义创建产品各部分的抽象接口
  3. 具体建造者(Concrete Builder)
    1. 实现建造者接口,具体定义如何构建产品的各部分
  4. 指挥者(Director)
    1. 调用建造者的方法,根据特定步骤指导对象的构建过程

代码实现:

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修饰构造函数时,它将禁止类对象之间的隐式转换,以及禁止隐式调用拷贝构造函数。

相关推荐
Tiny_React3 小时前
智能体设计模式-CH06:规划(Planning)
设计模式
Meteors.5 小时前
23种设计模式——迭代器模式 (Iterator Pattern)详解
java·设计模式·迭代器模式
Tiny_React6 小时前
智能体设计模式-CH03:并行化(Parallelization)
设计模式
Tiny_React6 小时前
智能体设计模式-CH02:路由(Routing)
设计模式
Deschen6 小时前
设计模式-组合模式
java·设计模式·组合模式
Tiny_React9 小时前
智能体设计模式-CH01:提示链(Prompt Chaining)
设计模式
Asort9 小时前
JavaScript设计模式(十五)——解释器模式 (Interpreter)
前端·javascript·设计模式
白衣鸽子9 小时前
【基础数据篇】数据访问守卫:Accessor模式
后端·设计模式
Mr_WangAndy9 小时前
C++设计模式_行为型模式_观察者模式Observer(发布-订阅(Publish-Subscribe))
c++·观察者模式·设计模式