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

# 设计模式常考类型详解

设计模式是软件开发过程中经过反复验证的、针对特定场景下常见问题的通用解决方案。它不是语法规则,而是提升代码可复用性、可维护性和可扩展性的实践经验总结。根据功能定位,设计模式通常分为创建型模式结构型模式行为型模式三大类,本次聚焦面试与考试中最常出现的5种核心模式展开分析。

二、常考设计模式详情

模式类型应用场景核心思想
单例模式创建型全局唯一实例控制实例创建
工厂方法创建型对象创建解耦子类决定实例化
适配器模式结构型接口不兼容转换接口
观察者模式行为型一对多通知依赖通知
策略模式行为型算法可替换封装算法族

2.1 单例模式(Singleton)

核心定义:确保一个类在整个程序运行周期中仅存在一个实例,并提供一个全局访问该实例的统一入口。

  • 实现要点
    1. 将类的构造函数私有化,禁止外部通过new关键字直接创建实例
    2. 类内部维护一个静态私有变量存储唯一实例
    3. 提供一个公开的静态方法,用于获取该唯一实例(首次调用时初始化实例,后续调用直接返回已有实例)
  • 典型应用场景
    • 系统配置管理类:避免多实例导致的配置不一致问题
    • 日志记录器:统一日志写入入口,防止多实例同时写文件冲突
    • 数据库连接池:控制连接数量,避免资源过度占用
  • 常见实现方式对比
    实现方式线程安全懒加载性能适用场景
    饿汉式实例占用资源小、启动时确定需要使用
    懒汉式(双重校验锁)较高实例占用资源大、启动时不一定使用
    静态内部类Java等支持静态内部类的语言场景

2.2 工厂方法模式(Factory Method)

核心定义:定义一个创建对象的抽象工厂接口,让子类决定实例化哪一个具体产品类,将对象的实例化延迟到子类中完成。

  • 核心角色
    1. 抽象产品:定义产品的公共接口
    2. 具体产品:实现抽象产品接口的具体类
    3. 抽象工厂:声明创建产品的抽象方法
    4. 具体工厂:实现抽象工厂方法,返回具体产品实例
  • 典型应用场景
    • 支付网关对接:不同支付渠道(微信、支付宝、银联)对应不同的支付处理器,通过工厂方法动态创建对应实现
    • 日志框架适配:支持无缝切换Log4j、Slf4j等不同日志实现
    • 导出工具开发:根据导出格式(Excel、PDF、CSV)创建对应的导出处理器
  • 优势
    • 符合开闭原则:新增产品时只需新增对应工厂类,无需修改已有代码
    • 解耦对象创建与使用:调用方无需关心对象创建细节,仅需依赖抽象接口

2.3 适配器模式(Adapter)

核心定义:将一个类的接口转换成客户端期望的另一个接口,解决接口不兼容导致无法协同工作的问题。

  • 分类
    1. 类适配器:通过继承适配者类实现适配(单继承限制适用场景)
    2. 对象适配器:通过组合适配者对象实现适配(更灵活,推荐使用)
  • 典型应用场景
    • 第三方SDK集成:原有系统接口与第三方接口定义不一致时,通过适配器做转换层
    • 旧系统升级:新系统需要复用旧系统的功能,但接口不匹配的场景
    • 不同数据格式转换:例如将第三方返回的XML格式数据转换为系统内部使用的JSON格式
  • 与装饰器模式的区别
    适配器模式的核心是接口转换,目的是让不兼容的接口可以协同工作;装饰器模式的核心是增强原有功能,不改变原有接口,仅在原有能力基础上附加新特性。

2.4 观察者模式(Observer)

核心定义:定义对象间一对多的依赖关系,当一个对象(主题/被观察者)的状态发生改变时,所有依赖它的对象(观察者)都会收到通知并自动更新。

  • 核心角色
    1. 主题(Subject):维护观察者列表,提供注册、移除观察者和通知所有观察者的方法
    2. 观察者(Observer):定义更新接口,在收到主题通知时执行相应操作
  • 典型应用场景
    • 消息通知系统:用户关注的内容更新后,主动推送通知给所有关注用户
    • 事件监听机制:GUI框架中的按钮点击事件监听、Spring框架中的事件驱动模型
    • 数据同步:例如商品库存更新后,同步通知购物车、订单、促销等相关模块
  • 优势与注意事项
    优势:实现了主题与观察者之间的解耦,支持动态添加和删除观察者
    注意事项:当观察者数量过多时,通知过程可能耗时较长;需避免循环依赖导致的系统崩溃。

2.5 策略模式(Strategy)

核心定义:定义一系列算法,将每个算法分别封装起来,让它们之间可以互相替换,算法的变化独立于使用算法的客户端。

  • 核心角色
    1. 抽象策略:定义所有支持算法的公共接口
    2. 具体策略:实现抽象策略接口,封装具体的算法逻辑
    3. 上下文(Context):持有策略对象的引用,提供给客户端调用的接口
  • 典型应用场景
    • 支付方式选择:不同支付方式(余额支付、银行卡支付、花呗支付)对应不同的计算逻辑,可封装为不同策略
    • 排序算法选择:根据数据规模、排序要求动态选择快速排序、冒泡排序或归并排序
    • 优惠活动计算:不同促销活动(满减、折扣、优惠券)对应不同的优惠计算规则
  • 优势
    • 避免使用大量条件判断语句(if-else/switch)
    • 算法可以独立演化和扩展,客户端无需感知变化
    • 运行时可以动态切换算法实现

三、设计模式面试考察重点

  1. 概念辨析:能够清晰区分相似模式的适用场景差异,例如工厂方法与抽象工厂、适配器与装饰器、策略与状态模式的区别
  2. 代码实现:能够手写单例模式、观察者模式等核心模式的基础实现代码,了解不同实现方式的优缺点
  3. 场景应用:能够结合实际业务场景,选择合适的设计模式并说明选型理由
  4. 优缺点分析:能够客观分析每种模式的适用边界,以及引入模式带来的额外复杂度

四、设计模式使用原则

使用设计模式的核心目标是提升代码质量,而非为了使用模式而使用模式。实际开发中应遵循以下原则:

  • 优先遵循SOLID设计原则,模式是原则的具体实现手段
  • 简单优先:如果简单代码可以满足需求,不要过度设计引入复杂模式
  • 逐步重构:当代码出现重复、扩展困难等问题时,再考虑引入合适的模式优化
http://www.jsqmd.com/news/621421/

相关文章:

  • 一文搞懂 Spring Cloud:从入门到实战的微服务全景指南(建议收藏)潭
  • 3000h上岸中科大11408,初试“狂砍”380+
  • 2026年口碑好的HPP商用保鲜灭菌一体机/内蒙古HPP食品保鲜设备厂家精选合集 - 品牌宣传支持者
  • 动态规划——01背包、完全背包(python,二维DP)
  • 前端与后端分离架构:从理论到实践
  • 基于springboot+vue古树名木资源保护管理系统hx1530FIA1
  • SAMD微控制器安全Flash存储库设计与实践
  • ROS导航调参指南:机器人模型、TEB/DWA与Costmap全解析
  • EspSleep:ESP8266超长深度睡眠库(585亿年理论休眠)
  • 告别查重焦虑!PaperXie 四大查重系统,精准搞定毕业论文重复率 + AIGC 率
  • Nvidia设备做快速推理部署
  • 嵌入式双向链表库:Arduino/STM32轻量级DoubleLinkedList实现
  • VisionPro图像掩膜进阶技巧:3步优化PMAlign工具匹配准确率(附真实案例)
  • 视觉神经元也懂“脑补”?Neuron最新发文揭示自然场景下的视觉模式补全机制
  • GPT系列演进:从GPT-1到GPT-4的生成式预训练范式升级
  • Flutter OH 性能分析-滑动响应时延
  • 小学阶段的核心1000词Ⅰ 身体与健康篇 (Body Health)干词背单词,记得快!
  • SHAP violin plot 自定义配色方案实战
  • ThinkBook16双系统实战:Win11+Ubuntu22.04共存的极简分区方案(附避坑指南)
  • 如何批量创建SQL存储过程_使用脚本自动化部署流程
  • AI民主化:让每个人都能开发AI应用,是理想还是泡沫?
  • 机械识图:第一角投影
  • 【JAVA基础面经】线程安全的单例模式
  • 【Python办公】批量文件重命名
  • 查重一次省百元!PaperXie 四大检测系统,本科生论文通关的省钱秘籍
  • Python机器学习框架对比:从理论到实践
  • rag系统落地化
  • 项目介绍 MATLAB实现基于双向长短期记忆网络(BiLSTM)进行锂电池剩余寿命预测的详细项目实例(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动
  • 2026年04月10日最热门的开源项目(Github)
  • mysql数据库索引失效的常见原因_分析索引设计与使用误区