🎯 一、面试中常问的设计模式及其简洁定义
模式名 | 常被问到 | 解释(简洁) |
---|---|---|
单例模式 | ✅ 高频 | 保证一个类只有一个实例,并提供全局访问点。 |
工厂模式 | ✅ 高频 | 创建对象的接口由子类决定,屏蔽了对象创建逻辑。 |
抽象工厂模式 | ✅ | 提供多个产品族的一组工厂方法。 |
建造者模式 | ✅ | 将复杂对象的构建过程拆分,并允许按步骤构建。 |
原型模式 | ✅ | 通过复制已有对象来创建新对象。 |
策略模式 | ✅ 高频 | 封装一组可互换的算法,并使它们之间可以替换。 |
观察者模式 | ✅ 高频 | 对象之间一对多依赖关系,通知所有观察者对象。 |
适配器模式 | ✅ | 转换接口,使原本不兼容的接口协同工作。 |
装饰器模式 | ✅ | 动态地添加功能,而无需修改原类结构。 |
责任链模式 | ✅ | 将多个处理器连接成链,请求沿链传递直到被处理。 |
命令模式 | ☑️ | 封装请求为对象,方便存储、撤销或日志记录。 |
✅ 二、常见面试问题与回答示范
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(接口隔离) | 不要强迫用户实现不需要的接口 |
📌 面试应对建议
-
回答模式定义 + 应用场景 + 示例代码(可简述)
-
面试建议熟练掌握:单例、工厂、策略、观察者、装饰器
-
能联系实际项目更佳,比如:“我用工厂模式封装了我们系统中不同数据源对象的创建逻辑”