持续总结中!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中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的