当前位置: 首页 > news >正文

面试中常问的设计模式及其简洁定义

🎯 一、面试中常问的设计模式及其简洁定义

模式名常被问到解释(简洁)
单例模式✅ 高频保证一个类只有一个实例,并提供全局访问点。
工厂模式✅ 高频创建对象的接口由子类决定,屏蔽了对象创建逻辑。
抽象工厂模式提供多个产品族的一组工厂方法。
建造者模式将复杂对象的构建过程拆分,并允许按步骤构建。
原型模式通过复制已有对象来创建新对象。
策略模式✅ 高频封装一组可互换的算法,并使它们之间可以替换。
观察者模式✅ 高频对象之间一对多依赖关系,通知所有观察者对象。
适配器模式转换接口,使原本不兼容的接口协同工作。
装饰器模式动态地添加功能,而无需修改原类结构。
责任链模式将多个处理器连接成链,请求沿链传递直到被处理。
命令模式☑️封装请求为对象,方便存储、撤销或日志记录。


✅ 二、常见面试问题与回答示范


1️⃣ Q:什么是单例模式?为什么用它?

A:单例模式是一种创建型设计模式,用来确保某个类只有一个实例,并提供一个全局访问点。在系统中有些对象,比如数据库连接池、日志系统、线程池,只需要一个实例,这时就用单例模式。
它可以避免资源浪费,同时方便管理,比如在 Go 中可用 sync.Once 实现线程安全的懒加载。


2️⃣ Q:多例模式是什么?和单例有什么区别?

A:多例模式是指一个类可以创建有限个实例(不是唯一也不是无限),比如每个数据库连接根据配置创建一个实例,常用于数据库连接池、资源管理等场景。

单例是严格的一个实例,多例可以是多个(但受限)。


3️⃣ Q:工厂模式的作用是什么?和 new 有啥区别?

A:工厂模式主要是为了解耦对象创建的过程和使用者,通过一个工厂类封装 new 的细节。它可以让代码更灵活、更符合开闭原则。如果直接用 new,就把对象的类型硬编码死了,不利于扩展和测试。


4️⃣ Q:抽象工厂和工厂方法有什么区别?

A:工厂方法针对的是一个产品等级结构,比如生产不同类型的按钮;而抽象工厂是为多个产品族提供一组创建接口,比如一整套 UI(按钮、窗口、文本框)。抽象工厂更复杂,适用于多种产品组合的场景。


5️⃣ Q:什么是观察者模式?用在哪里?

A:观察者模式是行为型设计模式之一,用于建立对象之间的一对多依赖关系,当一个对象(被观察者)状态变化时,所有依赖它的对象(观察者)都会收到通知并自动更新。

场景:GUI 事件监听、发布订阅系统(如消息队列)、Model-View 分离。


6️⃣ Q:策略模式和状态模式的区别?

A:策略模式强调算法的可替换性,用户根据需要选择不同策略;状态模式强调对象状态的变化行为不同。策略是用户主动选,状态是系统内部变化导致行为切换。


7️⃣ Q:装饰器和适配器有什么区别?

特点装饰器模式适配器模式
目的添加额外功能兼容不同接口
影响对象原对象 + 新功能将 A 接口转为 B 接口
举例记录日志、权限校验旧接口适配新系统


🧠 三、常考设计原则(附一句话)

原则名一句话记忆
SRP(单一职责)一个类只负责一件事
OCP(开闭原则)对扩展开放,对修改关闭
LSP(里氏替换)子类可以替换父类使用
DIP(依赖倒置)面向接口编程
ISP(接口隔离)不要强迫用户实现不需要的接口


📌 面试应对建议

  • 回答模式定义 + 应用场景 + 示例代码(可简述)

  • 面试建议熟练掌握:单例、工厂、策略、观察者、装饰器

  • 能联系实际项目更佳,比如:“我用工厂模式封装了我们系统中不同数据源对象的创建逻辑”

http://www.xdnf.cn/news/385651.html

相关文章:

  • 【React】Craco 简介
  • JavaScript 循环语句全解析:选择最适合的遍历方式
  • 客服系统重构详细计划
  • 如何选择 RabbitMQ、Redis 队列等消息中间件?—— 深度解析与实战评估
  • 御网杯2025 Web,Msic,密码 WP
  • Docker、ECS 与 K8s 网段冲突:解决跨服务通信中的路由问题
  • [思维模式-30]:《本质思考力》-10-产品研发的两种模式:①自顶向下的规划、分解、牵引;②自底向上的堆叠、聚合。
  • Win全兼容!五五 Excel Word 转 PDF 工具解决多场景转换难题
  • MyBatis快速入门——实操
  • spark运行架构及核心组件介绍
  • spark-Schema 定义字段强类型和弱类型
  • 06.three官方示例+编辑器+AI快速学习webgl_animation_skinning_additive_blending
  • openharmony系统移植之gpu mesa3d适配
  • [Java][Leetcode middle] 80. 删除有序数组中的重复项 II
  • 【MySQL】页结构详解:页的大小、分类、头尾信息、数据行、查询、记录及数据页的完整结构
  • MySQL InnoDB 表空间详解
  • numpy模块综合使用
  • 罗技无线鼠标的配对方法
  • 什么是具身智能
  • 关于物联网的基础知识(二)——物联网体系结构分层
  • 在python中,为什么要引入事件循环这个概念?
  • 图形化编程革命:iVX携手AI 原生开发范式
  • 电池单元和电极性能
  • AI大模型学习十八、利用Dify+deepseekR1 +本地部署Stable Diffusion搭建 AI 图片生成应用
  • [Java实战]Spring Boot 定时任务(十五)
  • 理解页内碎片与页外碎片:分页存储管理的关键问题
  • 《智能网联汽车 自动驾驶系统通用技术要求》 GB/T 44721-2024——解读
  • 【MySQL】行结构详解:InnoDb支持格式、如何存储、头信息区域、Null列表、变长字段以及与其他格式的对比
  • pandas读取pymysql和解析excel的一系列问题(版本不匹配)
  • C++23 views::repeat (P2474R2) 深入解析