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

2024-06-19 04:20

本文主要是介绍持续总结中!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的具体实现细节。这样,适配器模式使得新旧接口能够无缝集成,提高了应用程序的灵活性和可扩展性。

这篇关于持续总结中!2024年面试必问 20 道设计模式面试题(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073986

相关文章

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业