【第四节】C++设计模式(创建型模式)-Builder(建造者)模式

news/2025/2/23 21:26:53

目录

引言

一、Builder 模式概述

二、Builder 模式举例

三、Builder 模式的结构

四、Builder 模式的实现

五、Builder 模式的优缺点

六、总结


引言

        Builder 模式是一种创建型设计模式,旨在将复杂对象的构建过程与其表示分离。通过一步步构建对象,Builder 模式允许在构建过程中引入参数,从而生成不同的对象表示。本文将通过理论讲解和代码示例,深入探讨 Builder 模式的核心思想、适用场景及其实现方式。

一、Builder 模式概述

核心思想
        Builder 模式的核心思想是将复杂对象的构建过程分解为多个步骤,并通过一个指导者(Director)对象来协调这些步骤。这样做的好处是:
        构建过程与表示分离:对象的构建过程独立于其最终表示,使得相同的构建过程可以生成不同的对象。
        灵活性:通过在每一步骤中引入参数,可以灵活地调整对象的构建过程。

适用场景
Builder 模式适用于以下场景:
        需要创建的对象非常复杂,由多个部分组成。
        对象的构建过程需要分步骤进行,且每个步骤可能需要不同的参数。
        希望将对象的构建过程与其表示分离,以便生成不同的对象表示。

二、Builder 模式举例

建造一栋房屋是一个复杂的过程,通常分为多个步骤,例如:
        (1)打地基:为房屋奠定基础。
        (2)搭建框架:构建房屋的主体结构。
        (3)安装水电:布置水管、电线等基础设施。
        (4)装修:进行内部和外部的装饰。

每个步骤都需要不同的材料和工艺,且可以根据需求进行调整。例如,地基的深度、框架的材料、装修的风格等都可以根据房屋的用途和预算进行定制。


在房屋建造过程中,Builder 模式可以很好地发挥作用:
        分步骤构建:将房屋的建造过程分解为多个步骤(如打地基、搭建框架等),每个步骤由专门的工人或团队负责。
        参数化构建:在每个步骤中引入不同的参数(如材料选择、设计风格等),从而生成不同的房屋。
        统一管理:通过一个总指挥(Director)来协调各个步骤,确保房屋的建造过程有序进行。


通过 Builder 模式,相同的建造过程可以生成不同的房屋。例如:
        经济型房屋:使用低成本材料,简化装修。
        豪华型房屋:使用高端材料,精心设计装修。
        环保型房屋:采用绿色建材,注重节能设计。


Builder 模式解决的问题与此类似:当我们需要创建的对象非常复杂时,可以通过分步骤构建对象,并在每一步骤中引入参数,从而生成不同的对象表示。

三、Builder 模式的结构

典型结构图


Builder 模式的典型结构包括以下几个角色:
        Product(产品):最终要构建的复杂对象。
        Builder(构建者):定义构建对象的各个步骤的接口。
        ConcreteBuilder(具体构建者):实现 Builder 接口,完成对象的具体构建。
        Director(指导者):负责调用 Builder 的步骤,控制对象的构建过程。

关键点
        分步骤构建:Builder 模式通过分步骤构建对象,使得构建过程更加清晰和可控。
        参数化构建:在每一步骤中引入参数,可以生成不同的对象表示。

四、Builder 模式的实现

代码示例
        以下是一个简单的 Builder 模式实现示例,展示了如何分步骤构建一个复杂对象。


产品类定义

// Product.h
#ifndef _PRODUCT_H_
#define _PRODUCT_H_

class Product {
public:
    Product();
    ~Product();
    void ProducePart();
protected:
private:
};

class ProductPart {
public:
    ProductPart();
    ~ProductPart();
    ProductPart* BuildPart();
protected:
private:
};

#endif // ~_PRODUCT_H_

构建者类定义

// Builder.h
#ifndef _BUILDER_H_
#define _BUILDER_H_
#include <string>
using namespace std;

class Product;

class Builder {
public:
    virtual ~Builder();
    virtual void BuildPartA(const string& buildPara) = 0;
    virtual void BuildPartB(const string& buildPara) = 0;
    virtual void BuildPartC(const string& buildPara) = 0;
    virtual Product* GetProduct() = 0;
protected:
    Builder();
private:
};

class ConcreteBuilder : public Builder {
public:
    ConcreteBuilder();
    ~ConcreteBuilder();
    void BuildPartA(const string& buildPara);
    void BuildPartB(const string& buildPara);
    void BuildPartC(const string& buildPara);
    Product* GetProduct();
protected:
private:
};

#endif // ~_BUILDER_H_

构建者类实现

// Builder.cpp
#include "Builder.h"
#include "Product.h"
#include <iostream>
using namespace std;

Builder::Builder() {}
Builder::~Builder() {}

ConcreteBuilder::ConcreteBuilder() {}
ConcreteBuilder::~ConcreteBuilder() {}

void ConcreteBuilder::BuildPartA(const string& buildPara) {
    cout << "Step1: Build PartA..." << buildPara << endl;
}

void ConcreteBuilder::BuildPartB(const string& buildPara) {
    cout << "Step2: Build PartB..." << buildPara << endl;
}

void ConcreteBuilder::BuildPartC(const string& buildPara) {
    cout << "Step3: Build PartC..." << buildPara << endl;
}

Product* ConcreteBuilder::GetProduct() {
    BuildPartA("pre-defined");
    BuildPartB("pre-defined");
    BuildPartC("pre-defined");
    return new Product();
}

指导者类定义

// Director.h
#ifndef _DIRECTOR_H_
#define _DIRECTOR_H_

class Builder;

class Director {
public:
    Director(Builder* bld);
    ~Director();
    void Construct();
protected:
private:
    Builder* _bld;
};

#endif // ~_DIRECTOR_H_

指导者类实现

// Director.cpp
#include "Director.h"
#include "Builder.h"

Director::Director(Builder* bld) {
    _bld = bld;
}

Director::~Director() {}

void Director::Construct() {
    _bld->BuildPartA("user-defined");
    _bld->BuildPartB("user-defined");
    _bld->BuildPartC("user-defined");
}

测试程序

// main.cpp
#include "Builder.h"
#include "Product.h"
#include "Director.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[]) {
    Director* d = new Director(new ConcreteBuilder());
    d->Construct();
    return 0;
}

五、Builder 模式的优缺点

优点
        构建过程与表示分离:对象的构建过程独立于其最终表示,使得相同的构建过程可以生成不同的对象。
        灵活性:通过在每一步骤中引入参数,可以灵活地调整对象的构建过程。
        易于扩展:新增构建步骤或调整构建顺序非常方便。

缺点
        复杂性增加:随着构建步骤的增多,Builder 模式的实现可能变得复杂。
        代码冗余:每个具体构建者类都需要实现相同的构建步骤接口,可能导致代码冗余。

六、总结

        Builder 模式是一种强大的设计模式,适用于复杂对象的构建。它通过分步骤构建对象,并将构建过程与表示分离,提供了灵活性和可扩展性。然而,在面对简单对象的构建时,Builder 模式可能显得过于复杂。因此,在实际开发中,应根据具体需求选择合适的设计模式


http://www.niftyadmin.cn/n/5863780.html

相关文章

解锁ApplicationContext vs BeanFactory: 谁更具选择性?

目录 一、聚焦源码回顾 &#xff08;一&#xff09;源码分析和理解 &#xff08;二&#xff09;简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 &#xff08;一&#xff09;主要特性总结 &#xff08;二&#xff09;直接建议 三、案例简单说明 &am…

宠物智能可穿戴产品调研报告

一、引言 随着人们生活水平的提高以及情感陪伴需求的增长&#xff0c;宠物在家庭中的地位愈发重要&#xff0c;宠物经济蓬勃发展。宠物智能可穿戴产品作为宠物市场与科技融合的新兴领域&#xff0c;正逐渐走进大众视野&#xff0c;为宠物饲养与管理带来新的变革。本调研旨在深…

CPU多级缓存与缓存一致性协议

CPU多级缓存与缓存一致性协议 CPU多级缓存和缓存一致性协议是计算机体系结构中优化性能与保证数据正确性的核心机制。以下从缓存层级设计、工作原理、一致性协议&#xff08;如MESI&#xff09;及其实现细节展开说明。 一、为什么需要多级缓存&#xff1f; CPU的计算速度远高…

开目3DCAPP系列:三维制造成本分析与估算软件3DDFC

开目3DDFC 是一款基于 MBD 模型和工艺知识库的专业三维制造成本分析与估算软件&#xff0c;在不依赖详细工艺路线的情况下&#xff0c;根据零件几何信息和精度信息一键式完成零件成本的分析与估算&#xff0c;为面向成本的设计优化提供参考指引&#xff0c;也为企业对外产品报价…

当今前沿技术:改变生活的创新趋势

3D打印技术在航空航天领域的应用越来越广泛。它有很多优势&#xff0c;特别是在降低制造成本和提高制造效率方面。首先&#xff0c;3D打印可以减少原材料浪费。在传统制造中&#xff0c;通常需要切割和加工材料&#xff0c;这会产生大量废料。而在3D打印中&#xff0c;材料仅在…

无人设备遥控器之如何分享数传篇

无人设备遥控器分享数传&#xff08;数据传输&#xff09;的方式主要依赖于其采用的通信技术和协议。 一、基于Wi-Fi技术的数据分享 设备连接&#xff1a; 确保无人设备遥控器和接收数据的设备&#xff08;如手机、平板电脑或电脑&#xff09;都支持Wi-Fi功能。 将接收数据…

解锁音频新境界:LALAL.AI 与 Audo Studio 深度解析

在音频处理的世界里&#xff0c;噪音常常是困扰我们的一大难题。无论是专业的音频工作者&#xff0c;还是普通的音频爱好者&#xff0c;都渴望拥有一款强大的工具来解决这个问题。今天&#xff0c;就为大家介绍两款来自 AI 工具导航&#xff08;AIDH.NET&#xff09;的 AI 语音…

【开源免费】基于SpringBoot+Vue.JS物流管理系统(JAVA毕业设计)

本文项目编号 T 211 &#xff0c;文末自助获取源码 \color{red}{T211&#xff0c;文末自助获取源码} T211&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…