【C++设计模式之建造者模式:创建型】分析及示例

news2024/12/26 23:47:22

简介

建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

描述

建造者模式通过将一个复杂对象的构建过程拆分成多个简单的部分,并由不同的建造者构建每个部分,最终组装成整的对象。这种方式可以灵活地构建不同的对象表示,同时封装了对象的构建过程。

原理

建造者模式的核心思想是将一个复杂对象的构建过程与其表示分离。通常,一个建造者接口定义了构建每个部分的方法,一个具体的建造者实现了该接口,并负责构建每个部分。最后,一个指挥者类根据具体的构建者来组装构建过程,并返回构建完成的对象。

类图

在这里插入图片描述
建造者模式中有几个角色:

  1. Director:导演类,按照已有的顺序告诉Builder建造
  2. Builder:抽象建造者,规范建造的方法
  3. ConcreteBuilder:具体的建造者,复实现抽象建造者的方法,并返回一个产品
  4. Product:产品类

示例

假设要构建一个电脑对象,该电脑对象包含CPU、内存和硬盘等部件。

  1. 创建一个电脑建造者接口(ComputerBuilder),其中定义了构建每个部分的方法。
  2. 创建了具体的电脑建造者类(ConcreteComputerBuilder),实现了建造者接口,并负责构建每个部分。
  3. 创建一个指挥者类(Director),根据具体的建造者来组装构建过程,并最终返回构建好的电脑对象。

C++示例代码如下:

#include <iostream>
using namespace std;

// 电脑类
class Computer {
public:
    void setCPU(const string& cpu) {
        this->cpu cpu;
    }
    void setMemory(const string& memory) {
        this->memory = memory;
    }
    void setHardDrive(const string& hardDrive) {
        this->hardDrive = hardDrive;
    }
    void showInfo() const {
        cout << "CPU: " << cpu << endl;
        cout << "Memory: " << memory << endl;
        cout << "Hard Drive: " << hardDrive << endl;
    }
private:
    string cpu;
    string memory;
    string hardDrive;
};

// 电脑建造者接口
class ComputerBuilder {
public:
    virtual void buildCPU() = 0;
    virtual void buildMemory() = 0;
    virtual void buildHardDrive() = 0;
    virtual Computer* get() = 0;
};

// 具体的电脑建造者
class ConcreteComputerBuilder : public ComputerBuilder {
public:
    ConcreteComputerBuilder() {
        computer = new Computer();
    }

    void buildCPU() override {
        computer->setCPU("Intel Core i7");
    }
    void buildMemory() override {
        computer->setMemory("16GB");
    }
    void buildHardDrive() override {
        computer->setHardDrive("1TB SSD");
    }
    Computer* getComputer() override {
        return computer;
    }

private:
    Computer* computer;
};

// 指挥者
class Director {
public:
    void setComputerBuilder(ComputerBuilder* builder)
    {
    	this->builder = builder;
    }

    void constructComputer() {
        builder->buildCPU();
 		builder->buildMemory();
        builder->buildHardDrive();
    }

private:
    ComputerBuilder* builder;
};

// 使用示例
int main() {
    Director director;
    ConcreteComputerBuilder builder;
    director.setComputerBuilder(&builder);
    director.constructComputer();

    Computer* computer = builder.getComputer();
    computer->showInfo();

    delete computer;

    return 0;
}

输出结果

CPU: Intel Core i7
Memory: 16GB
Hard Drive: 1TB SSD

解释

在上述示例中,首先定义了电脑类(Computer),其中包含了一些电脑的属性和显示信息的方法。
然后,创建了电脑建造者接口(ComputerBuilder),其中定义了构建每个部分的抽象方法,并定义了获取构建好的电脑的方法。
接着,创建了具体的电脑建造者类(ConcreteComputerBuilder),它实现了电脑建造者接口,并负责构建每个部分。
最后,创建了一个指挥者类(Director),它接收一个具体的建造者,并根据这个建造者来组装建过程。

在示例中,通过调用指挥者的constructComputer方法来使用具体的建造者构建电脑对象。最终,通过调用建造者的getComputer方法来获取构建好电脑对象,并调用它的showInfo方法来显示电脑的信息。

结论

建造者模式通过将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它提供了更加灵活和可复用的方式来构建复杂对象。

应用场景

建造者模式适用于以下情况:

  1. 当需要创建具有复杂内部结构的对象时,使用建造者模式可以简化构建过程;
  2. 当需要构建的对象具有不同的表示时,使用建造者模式可以根据不同的建造者生成不同的对象表示;
  3. 当需要封装对象的构建过程,以便于修改或扩展时,使用建造者模式可以将构建过程与表示分离,减少代码的耦合度。

建造者模式可以应用于各种场景,如复杂对象的构建、流程控制、组装不同的表示等。它通过将构建过程拆分为多个简单的部分,使得构建过程可控制和可扩,提供了更加灵活和可复用对象构建方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1062945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为云云耀云服务器L实例评测|部署个人音乐流媒体服务器 navidrome

华为云云耀云服务器L实例评测&#xff5c;部署个人音乐流媒体服务器 navidrome 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品规格1.3 产品优势1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 navidrome3.1 navidrome 介绍3.…

全志ARM926 Melis2.0系统的开发指引⑦

全志ARM926 Melis2.0系统的开发指引⑦ 编写目的11. 调屏11.1. 调屏步骤简介11.1.1. 判断屏接口。11.1.2. 确定硬件连接。11.1.3. 配置显示部分 sys_config.fex11.1.3.1. 配置屏相关 IO 11.1.4. Lcd_panel_cfg.c 初始化文件中配置屏参数11.1.4.1. LCD_cfg_panel_info11.1.4.2. L…

网课搜题 小猿题库多接口微信小程序源码 自带流量主

多接口小猿题库等综合网课搜题微信小程序源码带流量主&#xff0c;网课搜题小程序, 可以开通流量主赚钱 搭建教程1, 微信公众平台注册自己的小程序2, 下载微信开发者工具和小程序的源码3, 上传代码到自己的小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_…

【C语言经典100例题-70】求一个字符串的长度(指针)

代码 使用指针来遍历字符串&#xff0c;直到遇到字符串结尾的空字符\0为止&#xff0c;统计字符数量即为字符串长度。 #include<stdio.h> #define n 20 int getlength(char *a) {int len 0;while(*a!\0){len;a;}return len; } int main() {char *arr[n] { 0 };int l…

软技能继续挑战网络安全领域

根据 ISACA 的一份新报告&#xff0c;新的网络安全调查结果指出了网络安全专家缺乏的领域&#xff0c;其中人际技能、云计算和安全措施是网络安全专家最突出的技能缺陷。 59% 的网络安全领导者表示他们的团队人手不足。50% 的受访者表示有非入门级职位的职位空缺&#xff0c;而…

多媒体应用设计师

1.多媒体技术基础 1.1.媒体与技术 1.1.媒体 维基百科&#xff1a;传播信息载体 国际电信联盟&#xff08;ITU-T&#xff09;&#xff1a;感知、表示、存储和传输的手段和方法。 两层含义&#xff1a;存储信息的实体&#xff0c;媒质。传递信息载体&#xff0c;媒介。 1.2.国…

使用Python优雅的绘制甘特图

简介 Gantt图表是一种条形图&#xff0c;用于描绘项目进度。图表在垂直轴上列出要执行的任务&#xff0c;在水平轴上列出时间间隔。图中水平条的宽度显示每个活动的持续时间。在Python中&#xff0c;我们可以使用Plotly库来创建和展示Gantt图表。 基础的Gantt图表 首先&…

beego-简单项目写法--路径已经放进去了

Beego案例-新闻发布系统 1.注册 后台代码和昨天案例代码一致。,所以这里面只写一个注册的业务流程图。 **业务流程图 ** 2.登陆 业务流程图 登陆和注册业务和我们昨天登陆和注册基本一样&#xff0c;所以就不再重复写这个代码 但是我们遇到的问题是如何做代码的迁移&…

计算机专业毕业设计项目推荐12-志愿者管理系统(Spring+Js+Mysql)

志愿者管理系统&#xff08;SpringJsMysql&#xff09; **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&#xff0c;在编写的过程…

[NISACTF 2022]join-us - 报错注入无列名注入

点击登录&#xff0c;找到注入点 这种框&#xff0c;可以直接爆破关键字&#xff0c;看是否拦截&#xff0c;也可以手动尝试&#xff0c;发现、union、and、or、substr、database等关键字都拦截了 1、学到了&#xff1a;可以用数据库中不存在的表名或者不存在的自定义函数名爆…

面试高频手撕算法 - 01背包系列

1. 前言 为什么要专门去搞一下这个背包问题呢 ? 因为作者已经在两场面试中吃了这个亏, 尤其是在面深信服的测开岗的时候, 一面的难度适中, 加上面试官也没为难我, 侥幸让我过了. (以下是一面问题) 二面的时候, 主要问了项目和手撕算法. 当时项目个人觉得面的还不错, 因为本人是…

Mac下docker安装MySQL8.0.34

学习并记录一下如何用docker部署MySQL 在Docker中搜索并下载MySQL8.0.x的最新版本 下载好后&#xff0c;在Images中就可以看到MySQL的镜像了 通过下面的命令也可以查看docker images启动镜像&#xff0c;使用下面的命令就可以启动镜像了docker run -itd --name mysql8.0.34 -…

java项目log4j2单独为某个类配置日志文件

在项目中&#xff0c;一般都是把日志记录到一个日志文件中。 对应的log4j2.xml内容如下图所示&#xff1a;只有一个RollingFile节点&#xff0c;整个系统只会生成一个log日志文件。 生成的日志文件如下图&#xff1a; 当系统不断扩大&#xff0c;业务越来越复杂&#xff0c;所…

spark on hive

需要提前搭建好hive&#xff0c;并对hive进行配置。 1、将hive的配置文件添加到spark的目录下 cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf2、开启hive的hivemetastore服务 提前创建好启动日志存放路径 mkdir $HIVE_HOME/logStart nohup /usr/local/lib/apache-hi…

阶段五-Day02-jQuery

一、jQuery入门 1. 定义和特点 目前最流行的JavaScript函数库之一&#xff0c;对JavaScript进行了封装。 并不是一门新语言&#xff0c;而是将常用的、复杂的JavaScript操作进行函数化封装&#xff0c;封装后可以直接调用&#xff0c;大大降低了使用JavaScript的难度&#xf…

Dism软件安装指南:优化Windows系统的必备利器

主旨 有没有发现&#xff0c;自己的电脑时间一长&#xff0c;是不是就会变得越来越慢&#xff0c;越来越卡&#xff0c;当你去网上查资料的时候&#xff0c;都是说什么磁盘碎片清理&#xff0c;禁止程序自启动什么的&#xff0c;不是说这些方式没用&#xff0c;反而很有用&…

四、【选区】

文章目录 为什么使用选区&#xff1f;选区的用途&#xff1a;抠图、修图、调色、合成等怎么对选区进行操作&#xff1f;1.如何建立选区并对选区进行建立?2.加选和减选与交叉选区&#xff1f;3.选区前先调整羽化值: 为什么使用选区&#xff1f; 是我们在一个图片里面选中一个区…

基于Java的培训学校课程资源网站设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

gin 框架的 JSON Render

gin 框架的 JSON Render gin 框架默认提供了很多的渲染器&#xff0c;开箱即用&#xff0c;非常方便&#xff0c;特别是开发 Restful 接口。不过它提供了好多种不同的 JSON Render&#xff0c;那么它们的区别是什么呢&#xff1f; // JSON contains the given interface obje…

5分钟入门卷积算法

大家好啊&#xff0c;我是董董灿。 深度学习算法中&#xff0c;尤其是计算机视觉&#xff0c;卷积是无论如何都绕不过去的槛。 初学者看到这个算法后&#xff0c;很多是知其然不知其所以然&#xff0c;甚至不知道这个算法是做什么的&#xff0c;或者很疑惑&#xff0c;为什么…