不得不的创建型模式-建造者模式

news2024/11/15 9:46:57

目录

 建造者模式是什么

下面是一个简单的示例代码,演示了如何使用建造者模式来构建一个复杂对象:

面试中可能遇到的问题及回答:


 建造者模式是什么

建造者模式是一种创建型模式,它的目的是将复杂对象的构造过程分离成多个简单的步骤,以便于对象的构建与表示分离。它允许你通过一系列简单的步骤来创建一个复杂的对象,而无需了解该对象的内部构造细节。

底层原理: 建造者模式包括四个角色:产品类、抽象建造者、具体建造者和指挥者。其中,产品类表示被建造的复杂对象,抽象建造者定义了构建该对象所需的所有步骤和方法,具体建造者实现这些方法来构建对象,而指挥者负责协调和控制这些步骤的顺序和过程。

实际应用: 建造者模式通常适用于以下情况:

  1. 需要创建复杂的对象,这些对象包含多个部分,每个部分需要按照特定的顺序构建。
  2. 需要建造者模式是一种创建型模式,它的主要目的是将复杂对象的构造过程分离成多个简单的步骤,以便于对象的构建与表示分离。它允许您通过一系列简单的步骤来创建一个复杂的对象,而无需了解该对象的内部构造细节。

    底层原理: 建造者模式包括四个核心角色:产品类、抽象建造者、具体建造者和指挥者。其中,产品类表示被建造的复杂对象,抽象建造者定义了构建该对象所需的所有步骤和方法,具体建造者实现这些方法来构建对象,而指挥者负责协调和控制这些步骤的顺序和过程。

下面是一个简单的示例代码,演示了如何使用建造者模式来构建一个复杂对象:

#include <iostream>
#include <string>

using namespace std;

// 产品类
class Product {
public:
    void SetPartA(const string& partA) { partA_ = partA; }
    void SetPartB(const string& partB) { partB_ = partB; }
    void SetPartC(const string& partC) { partC_ = partC; }
    void Show() const {
        cout << "PartA: " << partA_ << endl;
        cout << "PartB: " << partB_ << endl;
        cout << "PartC: " << partC_ << endl;
    }

private:
    string partA_;
    string partB_;
    string partC_;
};

// 抽象建造者
class Builder {
public:
    virtual void BuildPartA() = 0;
    virtual void BuildPartB() = 0;
    virtual void BuildPartC() = 0;
    virtual Product GetProduct() = 0;
};

// 具体建造者
class ConcreteBuilder : public Builder {
public:
    void BuildPartA() override { product_.SetPartA("PartA"); }
    void BuildPartB() override { product_.SetPartB("PartB"); }
    void BuildPartC() override { product_.SetPartC("PartC"); }
    Product GetProduct() override { return product_; }

private:
    Product product_;
};

// 指挥者
class Director {
public:
    void Construct(Builder* builder) {
        builder->BuildPartA();
builder->BuildPartB();
builder->BuildPartC();
}
};

// 客户端代码
int main() {
Director director;
ConcreteBuilder builder;
director.Construct(&builder);
Product product = builder.GetProduct();
product.Show();
return 0;

 


在上面的示例中,`Product` 表示被构建的复杂对象,`Builder` 表示抽象建造者,定义了构建对象所需的所有步骤和方法。`ConcreteBuilder` 表示具体建造者,实现了这些方法来构建对象。`Director` 表示指挥者,负责协调和控制建造过程的顺序和过程。

在客户端代码中,首先创建了一个指挥者对象和一个具体建造者对象,然后将具体建造者对象传递给指挥者对象,并调用 `Construct` 方法来控制对象的构建过程。最后,通过调用具体建造者对象的 `GetProduct` 方法来获取构建完成的产品对象,并调用 `Show` 方法来展示该对象的属性。

面试中可能遇到的问题及回答:

问题1:什么是建造者模式?

答案1:建造者模式是一种创建型模式,它允许您分步骤地构建复杂对象。它将对象的构建过程分离成一系列相互独立的步骤,每个步骤由一个建造者对象负责完成。

问题2:建造者模式的主要组成部分有哪些?

答案2:建造者模式的主要组成部分有四个:产品类、抽象建造者类、具体建造者类和指挥者类。

  • 产品类:表示被构建的复杂对象,包含多个部件。
  • 抽象建造者类:定义了构建对象所需的所有步骤和方法,由具体建造者类来实现这些方法。
  • 具体建造者类:实现抽象建造者类中定义的方法,用于构建产品对象的各个部件。
  • 指挥者类:负责协调和控制建造过程的顺序和过程。

问题3:建造者模式有哪些优缺点?

答案3:

优点:

  • 可以封装对象的构建过程,使代码更加灵活、易于维护和扩展。
  • 可以分步骤地构建复杂对象,使得构建过程更加清晰、可控。
  • 可以隔离复杂对象的创建和使用,使得代码更加简洁、易于理解。

缺点:

  • 需要定义很多类,增加了代码量和复杂度。
  • 建造者模式在构建对象时,需要先创建建造者对象并将其传递给指挥者对象,可能会增加代码的复杂度。

问题4:建造者模式和工厂模式有什么区别?

答案4:建造者模式和工厂模式都是创建型模式,但是它们的目的和使用场景不同。工厂模式是用来创建一类产品,而建造者模式则是用来构建复杂对象。工厂模式只关心如何创建对象,而建造者模式关心如何分步骤地构建对象。另外,工厂模式通常只有一个工厂类,而建造者模式需要多个类来协作完成对象的构建。

问题5:建造者模式可以应用在哪些场景?

答案5:建造者模式适用于以下场景:

  • 构建复杂对象:当一个对象需要由多个部分组成,且这些部分的构建顺序和构建方式不固定时,可以使用建造者模式来构建对象。
  • 构建过程需要控制:当对象的构建过程需要进行一些特殊的控制和处理时,可以使用建造者模式来封装构建过程。
  • 需要创建不同表示的对象:当需要创建不同表示的对象时,可以使用建造者模式来封装创建过程,以便于创建不同表示的对象。

问题6:建造者模式和装饰者模式有什么区别?

答案6:建造者模式和装饰者模式都是对象组合的模式,但是它们的目的和使用场景不同。建造者模式是用来构建复杂对象,强调对象的组合方式;而装饰者模式则是用来动态地给对象添加新的行为和责任,强调对象的功能增强。此外,建造者模式通常只需要一个具体建造者类来构建对象,而装饰者模式可能需要多个具体装饰者类来添加不同的行为。

总之,建造者模式可以帮助您封装对象的构建过程,从而使得代码更加灵活,易于维护和扩展。
 

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

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

相关文章

你知道项目进度控制和跟踪的目的是什么吗?

项目进度控制和跟踪的目的是&#xff1a; 增强项目进度的透明度&#xff0c;当项目进展与项目计划出现偏差时&#xff0c;可以及时采取适当的措施。 1、计划是项目监控的有效手段 项目控制的手段是根据计划对项目的各项活动进行监控&#xff0c;项目经理可以使用甘特图来制…

界面控件DevExtreme使用指南 - 折叠组件快速入门(二)

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…

微信小程序nodejs+python+php+springboot+vue 微型整容医美挂号预约app系统

(a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有首页、个人中心、用户管理、体检预约管理、项目预约、系统管理等功能 (b) 用户&#xff1b;用户进入app可以实现首页、美容产品、我的等&#xff0c;在我的页面可以对在线预约、体检预约、项目预约等功能进行操作 本基于…

Unity之OpenXR+XR Interaction Toolkit实现 UI交互

一.前言 在VR中我们经常会和一些3D的UI进行交互&#xff0c;今天我们就来说一下如何实现OpenXRXRInteraction Toolkit和UI的交互。 二.准备工作 有了前两篇的配置介绍,我们就不在详细说明这些了&#xff0c;大家自行复习 Unity之OpenXRXR Interaction Toolkit接入Pico VR一体…

钉钉用一条斜杠,金山系用一张表格,做了华为一直想做的事

阿里的“新钉钉”又一次站在风口上 一场疫情导致数万企业停工的同时&#xff0c;却让阿里的钉钉、腾讯会议&#xff0c;还有字节跳动的飞书等在线协同办公产品火得一塌糊涂。 今天&#xff0c;OpenAI公司的一个chatGPT,让阿里、百度等各大互联网巨头扎堆发布大模型产品。 回顾…

如何在Web上实现激光点云数据在线浏览和展示?

无人机激光雷达测量是一项综合性较强的应用系统&#xff0c;具有数据精度高、层次细节丰富、全天候作业等优势&#xff0c;能够精确测量三维现实世界&#xff0c;为各个行业提供了丰富有效的数据信息。但无人机激光雷达测量产生的点云数据需要占用大量的存储空间&#xff0c;甚…

Gantt图和PERT图的相关知识

1、Gantt 图 Gantt图以时间为基准描述项目任务&#xff0c;可以清晰的描述每个任务从何时开始&#xff0c;到何时结束&#xff0c;以及每个任务的并行关系&#xff0c;但是不能反映项目各任务之间的依赖关系&#xff0c;也无法确定整个任务的关键所在。 2、PERT图 计划评审…

Canvas实现动态绘制圆周效果(沿圆周运动的圆的绘制)

步骤实现&#xff1a; 首先&#xff0c;创建一个 HTML 画布和一个 JavaScript 动画函数。 在画布上绘制一个圆。 定义一个变量来表示圆心的坐标和半径。 进行动画循环以更新圆心坐标&#xff0c;使其沿外圆周运动。 使用三角函数&#xff08;如 sin 和 cos&#xff09;来计…

前端代码版本管理规范

Git 是目前最流行的源代码管理工具。为规范开发&#xff0c;保持代码提交记录以及 git分支结构清晰&#xff0c;方便后续维护&#xff0c;总结了如下规范。 分支约定 ├── master # 生产分支 ├── release # 测试分支├── develop # 开发分支…

学系统集成项目管理工程师(中项)系列11b_沟通管理(下)

1. 沟通过程的有效性 1.1. 效果 1.1.1. 在适当的时间、适当的方式、信息被准确的发送给适当的沟通参与方&#xff08;信息的接收方&#xff09;&#xff0c;并且能够被正确的理解&#xff0c;最终参与方能够正确的采取行动 1.2. 效率 1.2.1. 强调的是及时提供所需的信息 2…

两数之和hash

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

基于opencv-python的深度学习模块案例

目录 图像分类 目标检测 人脸检测 姿态估计 车辆检测 一、图像分类 图像分类是基于深度学习的计算机视觉任务中最简单、也是最基础的一类&#xff0c;它其中用到的CNN特征提取技术也是目标检测、目标分割等视觉任务的基础。 具体到图像分类任务而言&#xff0c;其具体流…

Springcloud----Feign

在上一个案列中Springcloud-注册中心 使用的交互是利用RestTemplate发起远程调用的代码,Feign是Springcloud整合的声明式组件, Feign Feign和RestTemplate都是用于在Java中实现RESTful API调用的工具&#xff0c;但它们之间有一些区别和优缺点。 区别 Feign是一个声明式HTTP…

夜天之书 #82 Web API 简介

Application Programming Interface (API) 即应用程序接口。顾名思义&#xff0c;它是开发者访问应用程序的接口。 例如&#xff0c;你可以通过以下命令查询 GitHub 上特定代码仓库的元数据信息&#xff1a; curl https://api.github.com/repos/apache/pulsar GitHub 会返回以下…

Springboot——导入用户地址簿相关功能代码

目录 一、导入用户地址簿相关功能代码 1.1 需求分析 1.2 数据库对应的表 1.3 实体类 1.4 控制层 二、菜品展示 2.1 修改列表接口 2.2 设置对应接口查询套餐信息 三、购物车 3.1 购物车数据模型 3.2 代码开发 3.2.1 实体类 3.2.2 添加购物车 3.2.3 查看购物车 3.2.4 清空购…

clickhouse 为什么快?

文章目录 [TOC](文章目录) 前言一、什么是列式数据库&#xff1f;为什么要用列式数据库,优点是什么? 二、clickhouse入门1. 个人猜想2. 使用clickhouse引入依赖yml配置扫描mapper 2.生成相应代码,执行测试用例查询结果 总结 前言 例如&#xff1a;随着人工智能的不断发展&…

还在玩传统终端,不妨来试试全新 AI 终端 Warp

壹 ❀ 引 最近一段时间&#xff0c;AI领域如同雨后春笋般开始猛烈生长&#xff0c;processon&#xff0c;sentry&#xff0c;一些日常使用的工具都在积极接入AI&#xff0c;那么正好借着AI的风头&#xff0c;今天给大家推荐一款非常不错的智能终端 warp&#xff08;目前仅限ma…

Servlet配置与高效部署

作出网页后端的核心目标就是 , 基于 tomcat 编程进行网站后端的开发 , 肯定需要对 http 协议进行一系列操作 , 幸运的是 tomcat 已经把这些 http 相关的底层操作封装好了(监听端口 , 接收连接 , 读取请求 , 解析请求 , 构造请求对象等一系列操作) , 只需调用 tomcat 为我们提供…

VMware虚拟机安装Linux教程(Windows版)

VMware虚拟机安装Linux教程&#xff08;Windows版&#xff09; 第一步、安装 VM &#x1f4e2;&#x1f4e2;&#xff1a;VMware下载以及Linux系统镜像需要的小伙伴可以私信我&#xff0c;也可以去官网上下载&#xff0c;文章中不能涉及安装包啥的&#xff0c;不然显示侵权&a…

如何一键免费压缩PDF文件?最好的 PDF 阅读器免费下载!

PDF&#xff08;便携式文档格式&#xff09;是一种独立于应用程序和平台的通用文件格式。它确保不同的用户可以在各种软件、硬件或操作系统中接收具有相同格式和视觉呈现的相同内容。您还可以在需要时对 PDF 进行电子签名。因此&#xff0c;PDF 文档在学术和正式用途中具有普遍…