持续总结中!2024年面试必问 20 道设计模式面试题(三)

上一篇地址:持续总结中!2024年面试必问 20 道设计模式面试题(二)-CSDN博客

五、什么是建造者模式(Builder Pattern)?它解决了什么问题?

建造者模式(Builder Pattern)是一种创建型设计模式,它主要用于解决以下问题:

  1. 复杂对象的构建:当一个对象的构建过程涉及多个步骤,并且这些步骤可能会产生非常复杂的对象时,建造者模式提供了一种清晰的方式来构建这些对象。

  2. 相同的构建过程,不同的表示:在某些情况下,相同的构建过程可能会产生不同的结果。建造者模式允许通过相同的步骤构建出不同的产品。

  3. 避免使用构造函数重载:当对象的构造函数参数过多时,代码的可读性和可维护性会降低。建造者模式通过提供一种设置参数的方法来避免构造函数重载的问题。

  4. 分离对象的构建和表示:建造者模式允许在创建复杂对象的同时,将对象的创建和表示分离开来,使得构建过程可以在不影响表示的情况下独立变化。

  5. 不可变性:建造者模式通常用于创建不可变对象。一旦对象构建完成,它的状态就不能被改变。

  6. 逐步构建:在某些情况下,可能需要逐步构建对象,每一步可能依赖于前一步的结果。建造者模式提供了一种方法来逐步构建对象。

建造者模式通过以下角色来实现:

  • 产品(Product):定义了要创建的复杂对象的接口。
  • 具体产品(ConcreteProduct):实现产品接口的具体类,是构建过程产生的最终对象。
  • 建造者(Builder):定义创建产品的方法,它接受产品类的各种属性,并返回一个完整的产品对象。
  • 具体建造者(ConcreteBuilder):实现建造者接口,负责创建具体产品对象的实例。
  • 导演者(Director):负责使用建造者来创建产品的实例,它定义了产品的构建步骤。

建造者模式的工作原理:

  1. 定义产品接口:首先定义一个产品接口,它规定了产品的属性和行为。
  2. 实现具体产品:创建实现产品接口的具体类,这些类代表了最终要构建的对象。
  3. 定义建造者接口:定义一个建造者接口,它包含设置产品属性的方法和一个返回产品的构建方法。
  4. 实现具体建造者:创建一个或多个具体建造者类,实现建造者接口,并提供构建产品的具体实现。
  5. 使用导演者:导演者类使用具体建造者来创建产品实例。导演者类不依赖于具体产品和具体建造者,它只依赖于建造者接口。
  6. 构建产品:通过导演者调用具体建造者的方法来逐步构建产品,最后通过建造者获取最终的产品实例。

建造者模式通过将对象的构建过程封装在建造者类中,使得构建过程可以在不修改客户端代码的情况下进行变化,提高了代码的可维护性和可扩展性。同时,它也支持创建不可变对象,使得对象一旦构建完成,其状态就不能被改变,从而提高了对象的安全性。

六、请举例说明适配器模式(Adapter Pattern)的应用场景。

适配器模式(Adapter Pattern)是一种结构型设计模式,用于使原本不兼容的接口能够一起工作。以下是一些适配器模式的应用场景,以及一个具体的示例。

应用场景:

  1. 第三方库的集成:当你需要使用一个功能丰富的第三方库,但其接口与你的应用程序不兼容时,可以创建一个适配器来桥接它们之间的差异。

  2. 旧系统升级:在升级旧系统时,可能需要保留一些旧的组件。适配器模式可以用于将旧组件的接口适配到新的系统架构中。

  3. 硬件设备驱动:在硬件设备驱动开发中,适配器模式可以用来适配不同厂商的硬件接口,使得操作系统能够统一地管理和使用这些设备。

  4. 不同数据格式的转换:在处理不同数据格式时,可以使用适配器模式来创建一个统一的接口,以简化数据转换过程。

  5. UI组件的适配:在开发跨平台的用户界面时,可以使用适配器模式来适配不同操作系统的UI组件。

  6. 支付系统集成:在电子商务平台中,可能需要集成多种支付方式,每种支付方式都有自己独特的接口。适配器模式可以用来创建一个统一的支付接口。

示例:

假设你正在开发一个音频播放应用程序,需要集成一个新的音频解码库,但这个库的API与你现有的应用程序不兼容。以下是如何使用适配器模式来解决这个问题的示例。

假设的类和接口:
  • MediaPlayer:现有应用程序中的媒体播放接口
    // 现有应用程序的媒体播放接口
    interface MediaPlayer {void play(String audioType, String fileName);
    }// 新的音频解码库接口
    class AdvancedMediaPlayer {public void playVlc(String fileName) {System.out.println("Playing vlc file: " + fileName);}public void playMp4(String fileName) {System.out.println("Playing mp4 file: " + fileName);}
    }// 适配器类
    class MediaAdapter implements MediaPlayer {private AdvancedMediaPlayer advancedMediaPlayer;public MediaAdapter(AdvancedMediaPlayer advancedMediaPlayer) {this.advancedMediaPlayer = advancedMediaPlayer;}@Overridepublic void play(String audioType, String fileName) {switch (audioType) {case "VLC":advancedMediaPlayer.playVlc(fileName);break;case "MP4":advancedMediaPlayer.playMp4(fileName);break;}}
    }// 客户端代码
    public class Client {public static void main(String[] args) {AdvancedMediaPlayer advancedMediaPlayer = new AdvancedMediaPlayer();MediaPlayer mediaAdapter = new MediaAdapter(advancedMediaPlayer);mediaAdapter.play("VLC", "movie.vlc");mediaAdapter.play("MP4", "movie.mp4");}
    }
  • AdvancedMediaPlayer:新的音频解码库,具有不同的API。
  • MediaAdapter:适配器,用于使AdvancedMediaPlayerMediaPlayer接口兼容。
代码示例(Java):

在这个示例中,MediaPlayer是现有应用程序的媒体播放接口,AdvancedMediaPlayer是新的音频解码库,具有不同的API。MediaAdapter是一个适配器,实现了MediaPlayer接口,并在内部使用AdvancedMediaPlayer对象。客户端代码通过MediaAdapter与新的音频解码库进行交互,而不需要关心AdvancedMediaPlayer的具体实现细节。这样,适配器模式使得新旧接口能够无缝集成,提高了应用程序的灵活性和可扩展性。

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

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

相关文章

c语言---循环 、判断基础知识详解

if语句 else离最近的if语句结合。 if语句题目 //1. 判断一个数是否为奇数 //2. 输出1 - 100之间的奇数 #include <stdio.h> int main() {int n 0;scanf("%d", &n);if (n % 2){printf("奇数\n");}else{printf("不是奇数\n"…

[C#]使用深度学习算法opencvsharp部署RecRecNet广角图像畸变矫正校正摄像广角镜头畸变图像

【论文地址】 https://arxiv.org/abs/2301.01661 【训练源码】 https://github.com/KangLiao929/RecRecNet 【参考源码】 https://github.com/hpc203/recrecnet-opencv-dnn 【算法介绍】 广角镜头在VR技术中显示出诱人的应用&#xff0c;但它会在捕获的图像中引入严重的径…

镜头跟踪的两种方法

方法一 (1) 原理&#xff1a;使球与摄像机保持固定的角度和距离 (2) 给Main Camera添加CamraCtrller.cs组件 public Transform Player;//小球的Transformprivate Vector3 offset;//小球与摄像机位置的偏移&#xff08;在三轴上的距离&#xff09;void Start(){offset Playe…

深度神经网络——什么是降维?

引言 什么是降维&#xff1f; 降维是用于降低数据集维度的过程&#xff0c;采用许多特征并将它们表示为更少的特征。 例如&#xff0c;降维可用于将二十个特征的数据集减少到仅有几个特征。 降维通常用于无监督学习任务 降维是一个用于降低数据集维度的过程&#xff0c;采用许…

【中文】PDF文档切分\切片\拆分最优方案-数据预处理阶段,为后续导入RAG向量数据库和ES数据库实现双路召回

目的 将PDF文档拆开&#xff0c;拆开后每个数据是文档中的某一段&#xff0c;目的是保证每条数据都有较完整的语义&#xff0c;并且长度不会太长 项目自述 看了很多切分项目&#xff0c;包括langchain、Langchain-Chatchat、、Chinese-LangChain、LangChain-ChatGLM-Webui、…

c语言指针经典笔试题

指针的笔试题目 //深度讨论数组名 int main1() {int a[] { 1,2,3,4 };printf("%d\n", sizeof(a)); //sizeof内部出现数组名代表是整个数组的大小 //16printf("%d\n", sizeof(a 0)); //首元素地址0还是首元素地址 4/8printf("%d\n", sizeof(*…

TestProject Python SDK入门

2024软件测试面试刷题&#xff0c;这个小程序&#xff08;永久刷题&#xff09;&#xff0c;靠它快速找到工作了&#xff01;&#xff08;刷题APP的天花板&#xff09;-CSDN博客跳槽涨薪的朋友们有福了&#xff0c;今天给大家推荐一个软件测试面试的刷题小程序。​编辑https://…

阻力支撑相对强度(RSRS)选股系列报告之三

https://download.csdn.net/download/SuiZuoZhuLiu/89447699?spm1001.2014.3001.5503https://download.csdn.net/download/SuiZuoZhuLiu/89447699?spm1001.2014.3001.5503

《维汉翻译通》App一款免费的维吾尔语翻译工具,也是新疆人学习中文的利器!维吾尔文OCR识别提取文字神器,功能丰富、界面简洁无广告、操作简单!

免费翻译&#xff0c;无界限沟通 《维汉翻译通》App提供免费的短文本翻译服务&#xff0c;无论是日常对话还是专业术语&#xff0c;都能迅速给出准确的翻译结果。维吾尔语免费翻译工具的加入&#xff0c;更是让这款App成为学习维吾尔语的必备应用。 智能OCR&#xff0c;文字识…

#QT(QCharts绘制曲线)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;绘制曲线图表 3.记录&#xff1a; 4.代码 pro QT core gui #加入以下代码引入charts QT charts greaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses depre…

关于数据库导入导出excel后出现前面的0消失或者有-的变成了日期

1、数据导出0消失 在数据库导出excel后&#xff0c;发现前面的数字0都消失了&#xff0c;怎么办呢&#xff0c;将需要转换的列转成字符串在导出 2、数据导入时&#xff0c;excel的0消失 载excel中输入’00001’&#xff0c;发现变成了‘1’&#xff0c;选中列点击右键–>设置…

python写一个ai agent对接仓库管理系统的业务流程

要实现一个AI agent对接仓库管理系统的业务流程&#xff0c;首先需要了解仓库管理系统的具体业务流程和需求。以下是一个简单的示例&#xff0c;用Python编写一个AI agent&#xff0c;用于对接仓库管理系统的业务流程。 1. 首先&#xff0c;定义一个类WarehouseManager&#xf…

场景设计题

为什么要这样分表&#xff1f;跨库join如何解决&#xff1f;数据量突增怎么解决&#xff1f; 如何解决线上问题&#xff1f;cpu狂飙怎么办&#xff1f;频繁minor gc怎么办&#xff1f;可能造成的原因是什么&#xff1f;如何避免&#xff1f; 数据库 隔离级别&#xff0c;怎么实…

npm发布自己的插件包:新手教程

npm&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;广泛用于JavaScript项目中。本文将为你介绍如何从零开始发布一个npm插件包。 前提条件 在开始之前&#xff0c;你需要确保以下几点&#xff1a; 安装Node.js和npm&#xff1a;你可以在No…

C++ 二叉搜索树【面试】

以下是一个简单的二叉搜索树实现&#xff0c;包括插入和查找操作的示例代码&#xff1a; #include <iostream>// 定义二叉搜索树的节点结构 struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} };//…

Spring Boot定时任务编程指南:如何创建和配置周期性任务

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …

基于Langchain构建本地大型语言模型(LLM)问答系统的经验分享

基于Langchain构建本地大型语言模型&#xff08;LLM&#xff09;问答系统的经验分享 https://download.csdn.net/download/xziyuan/89334371?spm1001.2101.3001.9500 最近&#xff0c;我一直在探索如何利用Langchain来构建一个本地的大型语言模型问答系统。在这个过程中&…

消息中间件比较:Redis,Kafka和RabbitMQ

对微服务使用异步通信时&#xff0c;通常使用消息代理。代理确保不同微服务之间的通信可靠且稳定&#xff0c;消息在系统内得到管理和监控&#xff0c;并且消息不会丢失。您可以从几个消息代理中进行选择&#xff0c;它们的规模和数据功能各不相同。这篇博文将比较三种最受欢迎…

不知道密码,一样能卸载瑞星esm防病毒终端安全防护系统

离开单位后试图卸载瑞星的时候却发现还需要密码&#xff0c;真是烦死了。研究了几分钟后找到了完美卸载方法。 首先&#xff0c;让我们请出老流氓360安全卫士&#xff0c;下载好它&#xff0c;让右键菜单出现使用 360强力删除这一选项。 之后&#xff0c;进入安全模式&#x…

中医药人工智能大模型正式启动

6月15日&#xff0c;在横琴粤澳深度合作区举行的中医药广东省实验室&#xff08;以下简称横琴实验室&#xff09;第一届学术委员会第一次会议暨首届横琴中医药科技创新大会上&#xff0c;中医药横琴大模型、中药新药智能自动化融合创新平台同时启动。这也是该实验室揭牌半年来取…