设计模式——建造者模式

概述:

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

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

核心思想:

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

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

建造者模式组成:

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

相关推荐
Kel4 小时前
MCP 传输链路全链路拆解:从字节流到协议栈的四层架构之旅
人工智能·设计模式·架构
atunet6 小时前
关于算法设计模式的演化与编程范式变迁的技术7
算法·设计模式
geovindu13 小时前
go:Timing Functions Pattern
开发语言·后端·设计模式·golang·计时函数模式·性能分析模式
咖啡八杯2 天前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
槑有老呆2 天前
从 Prompt Engineering 到 Harness Engineering:AI 编程的下一次跃迁
设计模式
HjhIron3 天前
从Prompt到Context:大模型应用开发的范式转移
设计模式·aigc·ai编程
咖啡八杯4 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
胡萝卜术5 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
亦暖筑序5 天前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
青禾网络8 天前
Web 前端如何接入 AI 音效生成:从零到可用的完整方案
人工智能·设计模式