通知图标

欢迎访问津桥芝士站

设计模式-建造者模式-C++

该帖子部分内容已隐藏
付费阅读
3积分
此内容为付费阅读,请付费后查看
来自AI助手的总结
建造者模式通过分步骤构建复杂对象,提高代码灵活性与可维护性,适用于多部件对象的创建。

一、引言

建造者模式(Builder Pattern)是一种创建型设计模式,用于分步骤构建一个复杂对象。其核心思想是将对象的构建与其表示分离,从而允许同样的构建过程可以创建不同的表示。建造者模式通常适用于构建具有多个组成部分的复合对象。

二、使用场景

  1. 复杂对象的建设:当需要构建的对象包括多个部分,且这些部分之间的构建顺序不明确时,建造者模式非常适用。例如构建一个复杂的房屋。

  2. 各种可配置对象的创建:当创建对象时需要设置多个可选参数,使用建造者模式可以避免构造函数中参数过多造成的混乱。

  3. 同一种类型的多个对象选择:当需要根据不同的配置或条件生成同种类型的多种对象时,可以通过建造者模式实现。

  4. 逐步构建和解耦:当某个对象的创建过程需要П。此外,程序的其他部分只需关注建造出来的对象,而不关心构造如何进行。

三、模式分类

  • 简单建造者:使用单个建造者,负责所有的产品构建。
  • 多建造者适配:当产品有多个形态或版本时,通过添加多个具体建造者来构建不同的产品表示。
  • 链式建造者:支持链式调用,使得用户能够更简洁地设置产品的各个部分。

四、优缺点

优点

  • 清晰的构建过程:对象构建的过程被清晰的定义,使得代码易于理解和维护。
  • 灵活性和扩展性强:可以很容易地扩展新类型的产品而无须改变已有代码。
  • 内部状态管理:允许细粒度控制对象的构建过程,尤其是在构建过程复杂时。

缺点

  • 增加类的数量:由于涉及到多个类(建造者、产品等)的使用,增加了系统的复杂性。
  • 小型对象的过度设计:对于简单的对象来说,引入建造者模式 直至增加了复杂性。
  • 需要同步:如果产品构建过程中包含多个操作,确保各个操作处于参照同步可能导致增加一些语言机制的开销。

五、代码示例

以下是一个建造者模式的C++实现示例。

#include <iostream>
#include <memory>
#include <string>

// 产品类
class Product {
private:
    std::string partA;
    std::string partB;
    std::string partC;

public:
    void setPartA(const std::string& value) { partA = value; }
    void setPartB(const std::string& value) { partB = value; }
    void setPartC(const std::string& value) { partC = value; }

    void show() const {
        std::cout << "Product Parts: " << partA << ", " << partB << ", " << partC << std::endl;
    }
};

// 抽象建造者
class Builder {
public:
    virtual void buildPartA() = 0;
    virtual void buildPartB() = 0;
    virtual void buildPartC() = 0;
    virtual std::shared_ptr<Product> getResult() = 0;
};

// 具体建造者
class ConcreteBuilder : public Builder {
private:
    std::shared_ptr<Product> product;

public:
    ConcreteBuilder() { product = std::make_shared<Product>(); }

    void buildPartA() override {
        product->setPartA("Part A Created");
    }

    void buildPartB() override {
        product->setPartB("Part B Created");
    }

    void buildPartC() override {
        product->setPartC("Part C Created");
    }

    std::shared_ptr<Product> getResult() override {
        return product;
    }
};

// 指导者类
class Director {
private:
    Builder* builder;

public:
    Director(Builder* builder) : builder(builder) {}

    void construct() {
        builder->buildPartA();
        builder->buildPartB();
        builder->buildPartC();
    }
};

int main() {
    ConcreteBuilder builder; // 创建建造者
    Director director(&builder); // 创建指导者并对建造者进行注入

    director.construct(); // 开始构建产品
    auto product = builder.getResult(); // 获取构建的产品
    product->show(); // 显示产品信息

    return 0;
}


代码解析

  1. Product:表示要构建的复杂对象,包含多个部分的设置方法和展示方法。
  2. Builder:是一个抽象接口,定义了构建产品的各个部分的方法及获取最终产品的方法。
  3. ConcreteBuilder:是具体的建造者实现类,实现了构建具体产品的所有阶段,并返回构建好的产品。
  4. Director:指导者类,因此他负责按照顺序构建产品的各个部分。
  5. main():创建建造者和指导者,利用指导者构建一个复杂的产品。

六、模式总结

建造者模式通过将复杂对象的构建过程分成多个步骤,使得客户端只需利用建造者接口构建对象,而不需要关心构建的具体细节。这种模式适合用于生产复杂和含有多个可选部分的对象。

尽管建造者模式有助于构建复杂对象,提高了代码的可读性和灵活性,但在设计上也要考虑是否真的需要增加新的建造者。如果对象很简单,直接使用构造方法可能对项目更有利。通过合理运用建造者模式,能帮助软件开发者提高代码设计的质量和有效性。

请登录后发表评论

    没有回复内容