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

2024-06-18 00:52

本文主要是介绍持续总结中!2024年面试必问 20 道设计模式面试题(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

三、请描述单例模式(Singleton Pattern)及其使用场景。

单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在软件系统中非常常见,因为它提供了一种控制实例数量和确保全局一致性的有效方法。

单例模式的特点:

  1. 唯一性:确保一个类只有一个实例。
  2. 全局访问点:提供一种方式来访问这个唯一的实例。
  3. 延迟实例化:只有在需要时才创建实例,这有助于节省资源。
  4. 线程安全:在多线程环境中,确保实例的唯一性,即使多个线程同时尝试访问实例。

单例模式的实现步骤:

  1. 私有化构造函数:将类的构造函数设为私有,防止外部通过new关键字创建实例。
  2. 私有静态变量:在类内部创建一个私有静态变量来存储类的唯一实例。
  3. 公有静态方法:提供一个公有静态方法,用于获取这个唯一实例。如果实例不存在,该方法会创建实例并返回;如果已经存在,则直接返回现有实例。

单例模式的示例(Java语言):

public class Singleton {// 私有静态变量,存储类的唯一实例private static Singleton instance;// 私有构造函数,防止外部通过new创建实例private Singleton() {}// 公有静态方法,提供全局访问点public static Singleton getInstance() {if (instance == null) {// 同步代码块,确保线程安全synchronized (Singleton.class) {// 再次检查实例是否为null,避免多线程环境下的竞态条件if (instance == null) {instance = new Singleton();}}}return instance;}
}

使用场景:

  1. 配置管理器:在应用程序中,配置信息通常只需要一个实例,比如数据库连接信息、应用设置等。
  2. 连接池:数据库连接池需要限制数据库连接的数量,单例模式可以确保连接池的全局唯一性。
  3. 日志记录器:日志记录器通常在应用程序中只需要一个实例,用于记录日志信息。
  4. 硬件管理器:管理硬件设备的类,如打印机管理器,可能只需要一个实例来控制所有打印任务。
  5. 资源管理器:对于需要全局访问的资源,如文件系统管理器,使用单例模式可以确保资源的一致性和有效管理。

示例场景:

假设你正在开发一个桌面应用程序,该应用程序需要一个日志记录器来记录所有操作的日志。使用单例模式,你可以确保整个应用程序中只有一个日志记录器实例,所有组件都使用这个实例来记录日志。

public class Logger {private static Logger instance;private List<String> logMessages;private Logger() {logMessages = new ArrayList<>();}public static synchronized Logger getInstance() {if (instance == null) {instance = new Logger();}return instance;}public void log(String message) {logMessages.add(message);}public List<String> getLogMessages() {return logMessages;}
}

在这个例子中,Logger类使用单例模式来确保全局只有一个日志记录器实例。应用程序中的任何组件都可以通过调用Logger.getInstance()来获取日志记录器实例,并使用它来记录日志。这样,所有的日志信息都存储在一个共享的列表中,便于管理和检索。

四、工厂模式(Factory Pattern)和抽象工厂模式(Abstract Factory Pattern)有什么区别?

工厂模式和抽象工厂模式都是创建型设计模式,它们用于创建对象,但它们之间存在一些关键的区别:

工厂模式(Factory Pattern)

  1. 定义:工厂模式定义了一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
  2. 目的:主要用于创建一个具体类的实例,这个具体类有多个参数或者创建过程比较复杂。
  3. 结构:包含一个工厂类(Factory Class)和一个或多个具体产品类(Concrete Product Classes)。
  4. 使用场景:当需要创建的对象是同一类的不同实例时使用,例如创建不同类型的汽车。
  5. 优点:隐藏了实例创建的细节,将对象创建和使用分离,提高了灵活性和可扩展性。

抽象工厂模式(Abstract Factory Pattern)

  1. 定义:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要指定它们具体的类。
  2. 目的:用于创建一系列相关的产品族,这些产品在结构上相互关联,例如创建具有不同风格的GUI组件。
  3. 结构:包含一个抽象工厂类(Abstract Factory Class),一个或多个具体工厂类(Concrete Factory Classes),以及一个或多个抽象产品类(Abstract Product Classes)和具体产品类(Concrete Product Classes)。
  4. 使用场景:当需要创建的产品族是相关联的,并且希望系统能够独立于具体产品类的设计变化时使用。
  5. 优点:提供了一种方式来保证客户端不依赖于具体的实现类,同时可以一起创建一组相关的产品。

区别总结:

  • 创建对象的个数:工厂模式通常用于创建一个具体类的实例,而抽象工厂模式用于创建相关或依赖的对象族。
  • 产品结构:工厂模式关注的是创建一个对象,而抽象工厂模式关注的是创建一个产品系列或产品组合。
  • 复杂性:抽象工厂模式比工厂模式更复杂,因为它需要定义更多的接口和类。
  • 使用场景:工厂模式适用于单一产品实例化的场景,而抽象工厂模式适用于需要同时创建多个相关或依赖产品的场景。
  • 扩展性:抽象工厂模式在添加新的产品对象时更加灵活,因为它允许通过添加新的具体工厂来扩展新的产品族,而不需要修改已有的工厂类。

示例:

  • 工厂模式示例:假设有一个汽车工厂,它可以根据客户的需求生产不同类型的汽车,如轿车、SUV等。每种类型的汽车都是一个具体产品。
  • 抽象工厂模式示例:假设有一个汽车工厂,它不仅生产汽车,还生产汽车的配件,如轮胎、发动机等。这些产品在结构上是相互关联的,形成一个产品族。

通过这些区别,我们可以看出,选择使用工厂模式还是抽象工厂模式取决于具体的需求和设计目标。

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



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

相关文章

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份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业