Java设计模式基础问答

news/2025/6/19 16:55:33

面试过程中会让你介绍你项目或实习中使用的设计模式,你该如何说明


工厂模式

工厂模式是把对象创建的逻辑封装到一个工厂类里面,我们用工厂类来创建对象

为什么需要工厂类(优点):

  1. 可以集中管理对象的创建规则。例如要求这个对象必须经过xx校验,写到工厂类里好过每一次使用这个类的时候再检验一轮
  2. 提高代码可维护性和拓展性。工厂类可以通过接口或抽象类定义创建方法,允许在不修改现有代码的情况下添加新的产品类型
  3. 简化复杂对象创建逻辑,优化代码冗余。对象的创建过程可能涉及复杂的初始化步骤(如参数校验、依赖注入、资源配置等),这些逻辑分散在业务代码中会导致代码冗余和可读性下降
  4. 对象逻辑变动时,无需修改具体业务,只需修改工厂类。将对象创建逻辑封装在工厂类中,业务代码只需通过工厂获取对象,无需关心具体实现。即使后续对象的创建方式变化,只需修改工厂类,而不影响业务逻辑

缺点:

  1. 过度设计问题。在需求简单且变化不大的场景下使用工厂模式,可能导致 “设计过度”,增加维护成本
  2. 子类膨胀问题。工厂方法模式中,每新增一种产品就需要新增一个具体工厂类,导致子类数量过多,增加系统负担

什么业务场景使用工厂模式:

  1. 对象要进行大量的校验逻辑或创建逻辑非常复杂。例如Sqlsession需要url,账号,密码,数据库类型等
  2. 一个类有多个子类,且该类适用于多个不同的场景。例如这是一个创建游戏角色的工厂类,有射手,战士,刺客等

Spring:

Datasource,使用工厂模式创建不同类型的数据源,客户端只需依赖 DataSource 接口,无需关心具体实现

可通过配置动态切换数据源(如从 HikariCP 切换到 Druid)


策略模式

策略模式是策略接口来定义统一行为的,具体的策略细节由子类来实现

可以将策略理解成方法,也就是方法类

例如你可以定义一个队列Queue,Queue的基本方法是add()和remove(),这个就是队列的基本行为。其他的优先队列等他会有Queue的基本行为,然后再进行拓展。

为什么需要策略模式(优点):

  1. 当前业务有统一的基础方法
  2. 策略模式切换灵活,可在基类基础上应对不同的场景
  3. 避免大量的if-else,代码可读性更强

缺点:

  1. 策略过多时会增加维护成本
  2. 简单策略导致的资源浪费,策略细节必须由子类来实现,所以即使是很简单的实现类也要弄多一个子类

什么业务场景使用策略模式:

业务有共同的行为,例如飞书通知和钉钉通知这种IM通知,一般来说都会定义一个接口有notify()基本方法来进行通知,这是他们的基本方法,其他方法自己在子类进行自定义增强

Spring:

TransationalManager事务管理器有

getTransational(),commit(),rollback()三种方法

它的子实现类有JPA事务和JDBC事务


责任链模式

责任链模式是让我们的一个请求,沿着一个链条从前往后进行处理

将多个处理者连成一条链,并沿着这条链传递请求,直到有对象处理它为止

优点:

  1. 解耦,降低耦合度,只需将实现类提交到责任链中
  2. 责任链动态调整机制,无需修改原有的代码,只需要修改责任链就可以达到业务修改
  3. 适用于串行,层次化处理逻辑

缺点:

  1. 配置失败可能会导致请求漏处理风险
  2. 处理链过长导致的性能下降问题
  3. 引入过多的类和对象增加系统复杂度
  4. 循环引用问题

什么业务场景使用责任链模式:

  1. 大量的if-else复杂逻辑处理,串行处理
  2. 处理逻辑可以复用,并且可以组合链节点应对不同业务的场景

Spring:

Spring的过滤器filter和拦截器interceptor用到了责任链模式

先进入DispatcherServlet拦截器-preHandler请求先处理-postHandler处理视图渲染前逻辑-afterCompletion请求后处理


单例模式

保证一类对象只有一个实例,防止创建多个实例,导致资源占用,使用对象不一致等问题

为什么需要单例模式:

  1. 全局状态管理,系统中需要维护一个全局状态(如配置信息、计数器),确保不同模块访问的是同一状态。例如日志管理器,配置管理器,Spring默认是单例-RedisTemplate-KafkaTemplate
  2. 需要为多个模块提供统一的资源访问入口。数据库连接池,线程池
  3. 适用于可复用场景,避免重复创造类。创建实例需要消耗大量资源,单例可减少开销
  4. 保证多线程下的线程安全和状态同步。如全局计数器和序列化生成器保证并发安全

缺点:

  1. 违反单一职责和开闭职责,单例类既负责创建又承担业务逻辑,单例类通常难以扩展,若需修改行为,可能需要直接修改单例类代码
  2. 若单例创建未正确处理线程安全,可能导致多实例问题。如双重检查锁定未使用 volatile
  3. 内存泄漏问题。单例持有的资源若未正确释放,会导致内存泄漏

什么业务场景使用单例模式:

  1. 需要有一个全局统一的实例,而不是多实例。如日志管理器,数据库连接池,线程池
  2. 需要保证多线程下的线程安全问题。如全局计数器

Spring:

Spring的Bean默认是单例模式,如RedisTemplate和KafkaTemplate等


https://dhexx.cn/news/show-5537768.html

相关文章

pnpm install 和 npm install 的区别

pnpm install 和 npm install 的区别 pnpm install 和 npm install 都是用于安装项目依赖的命令,但它们在依赖管理机制、磁盘空间占用、安装速度和依赖安全性上有显著区别: 核心区别总结 特性npmpnpm依赖存储平铺结构(嵌套改进版&#xff0…

Matlab点云合并函数pcmerge全解析

Matlab 中 pcmerge 函数的详细用法 1. 参数说明2. pcmerge函数调用示例2.1 示例1(对两个点云进行合并)2.2 示例2:对于大量点云数据的适用性分析3 结语1. 参数说明 pcmerge 是 MATLAB 提供的一个用于点云数据合并的函数。其主要作用是将两个点云对象按照指定的空间分辨率进行…

可视化在车间质量管控中的创新应用,提升品质

当某汽车工厂质检员还在用肉眼检查500个零件时,隔壁车间已用上“AI视觉检测系统”,在3秒内完成全车10万检测点筛查;某电子厂因人工漏检导致的百万级召回事件背后,藏着传统质检“看不见”的致命短板。本文将揭穿可视化质检的三大认…

行为设计模式之Memento(备忘录)

行为设计模式之Memento(备忘录) 前言: 备忘录设计模式,有点像vmware快照可以回滚,idea的提交记录同样可以混滚,流程引擎中流程可以撤销到或者回滚到某个指定的状态。 1)意图 在不破坏封装性的…

Mac M4 芯片运行大模型指南,包括模型微调与推理

Mac M4 芯片运行大模型指南,模型微调与推理 背景模型推理 Ollama🔍 举例说明:踩坑 模型微调 unsloth 背景 在国补、教育优惠、京东会员500优惠券等众多优惠之下。 我拿下了Macmini M4 16G 内存万兆网卡。在机器到手的第一时间,马…

第四章 RAG 知识库基础

代码仓库地址:https://github.com/Liucc-123/ai-agent 项目目标:通过项目实战掌握AI 大模型应用开发的常见知识,包括有:掌握AI 应用平台使用、AI 大模型接入、开发框架(Spring AI LangChain4j)、本地部署、…

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…

探秘鸿蒙 HarmonyOS NEXT:鸿蒙定时器,简单倒计时的场景应用

在鸿蒙 ArkTS 开发中,定时器是实现动态效果和定时任务的重要工具。基于鸿蒙 API 12 及以上版本,ArkTS 提供了功能丰富的定时器 API,本文将带你全面了解定时器的使用方法。 一、定时器常用 API 介绍 ArkTS 中的定时器主要分为一次性定时器&a…

Android --- Handler的用法,子线程中怎么切线程进行更新UI

我们都知道耗时操作需要放到子线程去操作,那我们可以new一个Thread来进行耗时操作,但是更新UI需要在主线程,就涉及到线程之间的切换,该如何处理呢?如下: 你可以通过使用 Handler 与 Looper.getMainLooper()…

案例解读:交安与建安安全员 C 证在实践中的差异

为了更直观地了解交安安全员证和建安安全员 C 证的区别,咱们通过实际案例来一探究竟。​ 案例一:在一条山区高速公路建设项目中,小张持有交安安全员 C 证。施工过程中,遇到一段复杂的地质路段,需要进行深挖方作业。小…