持续总结中!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等。每种类型的汽车都是一个具体产品。
  • 抽象工厂模式示例:假设有一个汽车工厂,它不仅生产汽车,还生产汽车的配件,如轮胎、发动机等。这些产品在结构上是相互关联的,形成一个产品族。

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

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

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

相关文章

持PMP证书可以免考申请CSPM-2国标证书!

一提到项目管理的专业认证&#xff0c;大家首先想到的肯定是以PMP为核心的PMI体系认证。当然也有BSI和IPMP等其他体系认证&#xff0c;但都是从国外引进的专业认证&#xff0c;我国始终缺少符合中国特色项目管理环境下的项目管理专业认证体系。 如今&#xff0c;更符合中国国情…

mysql面试题 Day2

1 长文本如何存储&#xff1f; 可以使用Text存储 TINYTEXT(255长度) TEXT(65535) MEDIUMTEXT&#xff08;int最大值16M&#xff09; LONGTEXT(long最大值4G) 2 大段文本存储如何设计表结构&#xff1f; 分表存储 分表后多段存储 3 大段文本查找时如何建立索引&#xff1…

Novartis诺华制药社招综合能力性格动机问卷入职测评笔试题库答案及包过助攻

【华东同舟求职】由资深各行业从业者建立的一站式人才服务网络平台&#xff0c;现阶段目标是“提升全市场各行业岗位信息的流动性和透明度”。我们接受众多行业机构的直接委托发布&#xff0c;并尽力通过各种方法搜寻高价值岗位信息。事实上&#xff0c;我们以发现不为人知的优…

经验分享,xps格式转成pdf格式

XPS 是一种电子文档格式、后台打印文件格式和页面描述语言。有时候微软默认打印机保存的是xps格式&#xff0c;我们如何转换为pdf格式呢&#xff0c;这里分享一个免费好用的网站&#xff0c;可以实现。 网站&#xff1a;https://xpstopdf.com/zh/ 截图&#xff1a;

HarmoneyOS星河版 安装和启动

一、下载和安装DevEco Studio 官网链接&#xff1a;OpenAtom OpenHarmony 1.1 找到对应的操作系统进行下载 创建安装Harmony的文件夹&#xff1a; 1.2 下载后进行安装 1.3 分别安装Node、Ohpm、SDK 分别安装Node、Ohpm和SDK 二、.创建一个新项目并运行 2.1 选择[OpenHarmon…

代码解读 | Hybrid Transformers for Music Source Separation[07]

一、背景 0、Hybrid Transformer 论文解读 1、代码复现|Demucs Music Source Separation_demucs架构原理-CSDN博客 2、Hybrid Transformer 各个模块对应的代码具体在工程的哪个地方 3、Hybrid Transformer 各个模块的底层到底是个啥&#xff08;初步感受&#xff09;&#xff1…

数据安全交换系统 与网闸有什么区别?

数据安全交换系统是指用于安全地传输、共享和交换数据的一种系统。这样的系统通常包括一系列安全性和隐私保护功能&#xff0c;确保数据在传输和存储过程中不会被未经授权的用户访问、泄露或篡改。 数据安全交换系统和网闸在功能和定位上有一些区别&#xff1a; 功能&#xff…

短剧系统搭建全攻略:功能齐全,一步到位

前言 近年来&#xff0c;短剧系统以其独特魅力&#xff0c;成为大众消遣娱乐的热门选择。简单来说&#xff0c;短剧系统就是用来看短剧的小程序&#xff0c;它汇集了丰富多彩的短剧资源&#xff0c;让观众随时随地享受观影乐趣。本文将为你详细解析短剧系统的搭建全攻略&#…

ROS系统中解析通过CAN协议传输的超声波传感器数据

CAN Bus接口设置&#xff1a;确保你的ROS系统可以通过CAN Bus接口与外部设备通信。这可能需要CAN卡或CAN适配器&#xff0c;以及相应的驱动程序和库。 CAN消息接收&#xff1a;配置ROS节点来监听特定的CAN ID&#xff0c;这通常是超声波传感器的标识符。 数据解析&#xff1a…

C++日志库 glog入门

glog&#xff08;Google Logging Library&#xff09;是由Google开源的一款C日志库&#xff0c;用于方便地记录日志信息。它支持四个级别的日志&#xff08;INFO、WARNING、ERROR、FATAL&#xff09;&#xff0c;并且可以将日志输出到文件和控制台&#xff0c;方便调试和问题追…

Aeron:两个代理之间的单向IPC(One-way IPC between two agents)

一、概述 本例展示了如何通过 IPC 在调度于不同线程的两个代理之间传输缓冲区。在继续学习本示例之前&#xff0c;最好先复习一下Simplest Full Example &#xff0c;因为该示例展示的是 IPC 通信&#xff0c;没有增加代理的复杂性。读者还应熟悉Media Driver 流程构建如下&…

学习笔记——路由网络基础——路由优先级(preference)

1、路由优先级(preference) 路由优先级(preference)代表路由的优先程度。当路由器从多种不同的途径获知到达同一个目的网段的路由(这些路由的目的网络地址及网络掩码均相同)时&#xff0c;路由器会比较这些路由的优先级&#xff0c;优选优先级值最小的路由。 路由来源的优先…

Glide 缓存机制研究及同命名图片的替换回显

背景&#xff1a; 相册-图片后处理场景&#xff0c;需要先展示一张原图&#xff0c;同时后台对图片进行算法优化&#xff0c;完成优化之后无缝替换原图展示&#xff0c;同时保证后续都展示算法优化后的图片 图片加载采用 Glide 库实现 画重点&#xff1a; 相册场景&#xff…

编程之道:程序员必备的五大职业素养

引言 在数字化时代&#xff0c;程序员的角色变得日益重要。他们不仅是代码的编写者&#xff0c;更是技术变革的推动者。然而&#xff0c;成为一名优秀的程序员&#xff0c;除了技术能力之外&#xff0c;还需要具备一系列职业素养。本文将探讨程序员在职业生涯中应具备的五大职业…

pycharm git配置

PyCharm 是一个强大的集成开发环境(IDE),它内置了 Git 集成,使得版本控制变得非常方便。以下是 PyCharm 中配置 Git 的基本步骤: 安装Git: 在开始之前,请确保已经在您的系统上安装了 Git。您可以通过官方网站下载并安装 Git。本系统用的是Git-2.29.2.2-64-bit 。 打开PyC…

24年下半年安徽教资认定准确时间和流程

安徽教资认定准确时间 网上报名时间&#xff1a; 第一批次&#xff1a;4月8日至4月19日17时 第二批次&#xff1a;6月17日至6月28日17时 注意&#xff1a;符合安徽省申请条件的普通大中专院校2024届全日制毕业生&#xff0c;应统一选择6月17日至6月28日17时的时间段进行网上报名…

vivado在implementation时出现错误[Place 30-494] The design is empty的一个可能原因和解决方法

在查询类似帖子时我发现这一问题是由于在设计实现时vivado认为没有输出端口所以报错。 于是在.v文件中我添加了一个随意的端口&#xff0c;并且在.xdc文件中为它分配了管脚 这样做的确可以让设计实现的过程顺利进行&#xff0c;但是会发现在summary中&#xff0c;设计实现的…

2024年6月17日 (周一) 叶子游戏新闻

期刊杂志: 聚合读者、意林、知音、故事会、花火以及国内各大知名报纸电子版&#xff0c;无需付费即可观看各种免费资源 中医自学宝典: 集合了中医医案&#xff0c;医经&#xff0c;方剂 药材知识的app&#xff0c;更方便的免费学习中医知识 《最终幻想7》重制三部曲总监鸟山求&…

每日复盘-202406017

今日关注&#xff1a; 20240617 六日涨幅最大: ------1--------301036--------- 双乐股份 五日涨幅最大: ------1--------301176--------- 逸豪新材 四日涨幅最大: ------1--------300868--------- 杰美特 三日涨幅最大: ------1--------301082--------- 久盛电气 二日涨幅最大…

阿里巴巴全球数学竞赛

都是很贴近生活的数学题&#xff0c;你来试试&#xff1f; 数学到底有没有用&#xff1f;华人数学家张益唐&#xff1a;数学很重要&#xff01; 在学校里辛辛苦苦学了那么多年&#xff0c;毕业后发现并不实用。学好数学到底有没有用&#xff1f; 昨天上午&#xff0c;华人数学家…