设计模式——建造者模式

概述:

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

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

核心思想:

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

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

建造者模式组成:

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

相关推荐
J_liaty15 小时前
23种设计模式一代理模式
设计模式·代理模式
苏渡苇21 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
短剑重铸之日1 天前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
feasibility.1 天前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
BD_Marathon1 天前
七大设计原则介绍
设计模式
YigAin1 天前
Unity23种设计模式之 享元模式
设计模式·享元模式
范纹杉想快点毕业2 天前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑2 天前
DDD领域驱动设计-基础设施层
设计模式·架构
小温冲冲2 天前
通俗且全面精讲工厂设计模式
设计模式
进击的小头2 天前
设计模式与C语言高级特性的结合
c语言·设计模式