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

C++建造者设计模式

什么是建造者设计模式

建造者设计模式是一种创建型设计模式,它是一种将复杂对象的分解为多个独立部分的模式,以便于构建对象的过程可以被抽象出来并独立变化。

该模式有什么优缺点

优点

  1. 灵活性:建造者设计模式允许对象的部分以不同的方式进行构建,从而提高了对象的灵活性。
  2. 分离性:建造者设计模式将对象的构建过程与其表示分离开来,使得两者可以独立变化。
  3. 可重用性:建造者设计模式可以将对象的构建过程封装起来,以便在不同的场景下重用。

缺点

  1. 复杂性:建造者设计模式需要定义多个类和接口,这会增加代码的复杂度。
  2. 可读性:建造者设计模式的代码可能不够直观,需要一定的经验才能理解。

如何使用

下面是一个使用C++实现建造者设计模式的例子:

c 复制代码
#include <iostream>  
#include <string>  
#include <vector>  
  
// 定义产品类  
class Product {  
public:  
    void add(std::string part) {  
        parts.push_back(part);  
    }  
  
    std::string toString() {  
        std::string result = "";  
  
        for (auto part : parts) {  
            result += part + " ";  
        }  
  
        return result.substr(0, result.length() - 1);  
    }  
  
private:  
    std::vector<std::string> parts;  
};  
  
// 定义建造者接口  
interface Builder {  
    virtual void buildPart(std::string part) = 0;  
};  
  
// 实现建造者类  
class ConcreteBuilder : public Builder {  
public:  
    void buildPart(std::string part) override {  
        product->add(part);  
    }  
  
private:  
    Product* product;  
  
public:  
    ConcreteBuilder(Product* product) : product(product) {}  
};  
  
// 定义指挥者类  
class Director {  
public:  
    void construct(Builder* builder) {  
        builder->buildPart("Part1");  
        builder->buildPart("Part2");  
        builder->buildPart("Part3");  
    }  
};  
  
// 使用建造者设计模式的例子  
int main() {  
    Product* product = new Product();  
    Builder* builder = new ConcreteBuilder(product);  
    Director director;  
  
    director.construct(builder);  
  
    std::cout << product->toString() << std::endl;  
  
    delete product;  
    delete builder;  
  
    return 0;  
}

在上面的例子中,我们首先定义了一个Product类,它表示要构建的对象。然后我们定义了一个Builder接口,它定义了构建对象的方法。接着我们实现了ConcreteBuilder类,它实现了Builder接口,并将对象的构建过程封装起来。最后我们定义了Director类,它负责指导构建过程。在main函数中,我们创建了一个Product对象和一个ConcreteBuilder对象,并将它们关联起来。然后我们使用Director类来指导构建过程,最终输出构建好的对象。需要注意的是,在使用建造者设计模式时,需要仔细设计接口和类之间的关系,以便正确地构建对象。

相关推荐
@淡 定2 分钟前
缓存原理详解
java·spring·缓存
带刺的坐椅7 分钟前
超越 SpringBoot 4.0了吗?OpenSolon v3.8, v3.7.4, v3.6.7 发布
java·ai·springboot·web·solon·flow·mcp
就叫飞六吧7 分钟前
基于spring web实现简单分片上传demo
java·前端·spring
apihz14 分钟前
免费手机号归属地查询API接口详细教程
android·java·运维·服务器·开发语言
程序员小假15 分钟前
学院本大二混子终于找到实习了...
java·后端
回吐泡泡oO16 分钟前
找不到rar.RarArchiveInputStream?JAVA解压RAR5的方案。
java·开发语言
jiayong2318 分钟前
AI应用领域编程语言选择指南:Java vs Python vs Go
java·人工智能·python
bjzhang7522 分钟前
IDEA 2025.3重磅发布,Ultimate 终极版和 Community社区版二合一,免费版可商用
java·idea
程序猿零零漆24 分钟前
Spring之旅 - 记录学习 Spring 框架的过程和经验(三)Bean的依赖注入配置、Spring的其它配置标签
java·学习·spring
TT哇27 分钟前
@AllArgsConstructor
java·开发语言