设计模式全解析:分类、核心原理与实践指南

设计模式是软件开发中经过验证的通用解决方案,用于解决特定场景下的代码设计问题,能显著提升代码的可复用性、可维护性与扩展性。

一、设计模式整体分类

设计模式按核心目的可分为三大类,各类别定位与作用如下:

分类 核心目的 核心作用
结构型模式 优化类、对象、接口之间的结构关系 简化对象间的关联,提升代码灵活性与复用性
创建型模式 规范对象的创建过程 解耦对象创建与使用,控制对象实例化逻辑
行为型模式 优化类与类之间的交互及算法执行 明确对象职责分工,简化交互流程,提升代码可扩展性

补充示意图

  • 设计模式整体分类关联图:
    设计模式分类图1
  • 设计模式核心特性示意图:
    设计模式分类图2

二、创建型模式:专注对象创建的设计方案

创建型模式聚焦于对象的创建逻辑,通过封装复杂的实例化过程,降低代码耦合度。常见创建型模式如下:

1. 单例模式

  • 核心定义:确保一个类仅有一个实例,并提供一个全局访问点;
  • 核心原则:一个类只负责一项职责(遵循单一职责原则),避免因多实例导致的状态混乱或资源浪费。

2. 简单工厂模式

  • 核心定义:定义一个工厂类,该类根据传入的参数,动态决定创建并返回哪一种产品类的实例;
  • 核心特点:工厂类集中管理对象创建逻辑,客户端无需关注具体产品的实例化细节。

3. 工厂方法模式

  • 核心定义:定义一个用于创建产品对象的工厂接口,将实际创建工作推迟到工厂接口的子类中;
  • 模式类型:类的创建模式;
  • 核心优势:遵循开闭原则,新增产品时无需修改原有工厂逻辑,仅需新增对应的工厂子类。

4. 抽象工厂模式

  • 核心定义:提供一个创建一系列相关或相互依赖对象的接口,无需明确指定具体类;
  • 适用场景:需创建多个产品族(一组相关产品),且产品族之间存在依赖关系的场景。

5. 建造者模式(构建者模式)

  • 核心定义:封装复杂对象的构建过程,允许按步骤构造对象,且能使相同的构建过程创建不同的对象表示;
  • 核心关键:将复杂对象的“构建过程”与“对象本身的表示”分离;
  • 参考资料:构建者模式(建造者模式)

6. 原型模式

  • 核心定义:以一个对象为原型,通过复制(克隆)的方式创建多个与原型类似的新实例;
  • Java中的实现:Object类实现Cloneable接口,对象可通过调用clone()方法完成克隆,是原型模式的典型应用;
  • 核心特性:绝大多数设计模式通过牺牲部分性能提升开发效率,而原型模式是少数通过牺牲少量开发效率(需处理克隆逻辑)来提升对象创建性能的模式;
  • 核心用途:
    1. 解决复杂对象创建时的资源消耗问题,提升实例化效率;
    2. 实现保护性拷贝,防止外部修改只读对象的内部状态。

三、结构型模式:优化对象结构的设计方案

结构型模式通过调整类与对象的组合关系,简化系统结构,提升代码的灵活性与复用性。常见结构型模式如下:

1. 适配器模式(变压器模式)

  • 核心定义:将一个类的接口转换成客户端期望的另一种接口,使原本因接口不匹配而无法协同工作的两个类能够正常交互;
  • 核心特性:适配类可根据传入的参数,返回符合客户端需求的实例,实现接口兼容。

2. 组合模式

  • 核心定义:将对象组合成树形结构,以表示“部分-整体”的层次关系;
  • 核心优势:客户端可统一对待单个对象和组合对象,无需区分处理逻辑。

3. 装饰模式(装饰器模式)

  • 核心定义:在不修改原类文件、不使用继承的前提下,通过创建包装对象(装饰器)动态地为目标对象添加新功能;
  • 实现逻辑:装饰器包裹真实对象,在转发请求的过程中附加额外功能,实现动态拓展;
  • 参考资料:装饰器模式

4. 代理模式

  • 核心定义:为其他对象提供一个代理对象,通过代理控制对目标对象的访问;
  • 模式类型:结构型设计模式;
  • 核心作用:解决直接访问对象时的耦合问题,代理类负责为委托类预处理消息、过滤消息、转发消息,以及处理消息执行后的后续逻辑;
  • 参考资料:

5. 亨元模式

  • 核心定义:通过共享技术,有效支持大量细粒度的对象创建与管理;
  • 核心优势:减少重复对象的创建,降低系统内存消耗。

6. 外观模式

  • 核心定义:为子系统中的一组接口提供一个统一的对外访问入口,客户端通过该入口与子系统交互,无需关注子系统内部的复杂逻辑;
  • 核心作用:简化子系统的使用,降低客户端与子系统的耦合度。

7. 桥接模式

  • 核心定义:将抽象部分与它的实现部分分离,使两者可以独立变化;
  • 适用场景:抽象与实现存在多维度变化,需避免因组合导致的类爆炸问题。

四、行为型模式:优化对象交互的设计方案

行为型模式专注于类与类之间的交互逻辑、算法执行流程的设计,明确对象职责,提升代码的可扩展性与可维护性。常见行为型模式如下:

1. 模板模式

  • 核心定义:定义一个算法的骨架结构,将算法中部分步骤延迟到子类实现;
  • 核心逻辑:
    1. 提前定义算法中不易改变的通用步骤及执行顺序;
    2. 将需要个性化实现的步骤抽象为抽象方法,交由子类完成;
    3. 封装公共代码,对外提供统一的调用入口;
  • 核心优势:封装不变部分,扩展可变部分,提取公共代码,便于维护;
  • 客户端特性:无需了解算法内部实现,仅需实现自身独特的个性化方法。

2. 解释器模式

  • 核心定义:给定一种语言,定义其文法的表示形式,并设计一个解释器,用于解释该语言中的表达式。

3. 策略模式

  • 核心定义:定义一系列算法,将每个算法封装成独立的对象,并使它们可以相互替换;
  • 模式特点:类的行为或算法可在运行时动态切换;
  • 核心组件:
    1. 策略对象:封装具体算法;
    2. 上下文对象(Context):行为随策略对象的改变而改变,负责调用策略对象执行算法;
  • 参考资料:责任链模式和策略模式

4. 状态模式

  • 核心定义:允许一个对象在其内部状态改变时,自动改变它的行为(对象看起来像是改变了它的类)。

5. 观察者模式(发布/订阅模式)

  • 核心定义:定义对象间的一对多依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖它的对象(观察者)都会收到通知并自动更新;
  • 核心优势:解耦观察者与被观察者,避免组件间紧密耦合;
  • 实现逻辑:被观察者提供注册/注销观察者的方法,状态变更时主动向所有注册的观察者发送通知。

6. 备忘录模式

  • 核心定义:在不破坏对象封装性的前提下,捕获对象的内部状态,并在需要时恢复该状态;
  • 核心用途:实现对象状态的备份与回滚(如编辑器的撤销功能)。

7. 中介者模式

  • 核心定义:用一个中介对象封装一系列对象之间的交互,使对象之间无需直接通信,而是通过中介者间接交互;
  • 核心优势:减少对象间的直接耦合,简化交互逻辑,便于维护。

8. 命令模式

  • 核心定义:将命令请求封装为一个对象,使开发者可以用不同的请求对客户端进行参数化,同时支持请求的排队、记录与撤销。

9. 访问者模式

  • 核心定义:在不改变数据结构的前提下,为一组对象元素新增作用于它们的新功能;
  • 适用场景:数据结构复杂且稳定(不易变化),但需频繁为其添加新操作(如复杂集合对象、XML文档解析、编译器设计、ASM框架等);
  • 参考资料:访问者模式

10. 责任链模式

  • 核心定义:将请求的发送者与接收者解耦,创建一个接收者对象链,当请求发出时,沿着链传递,直到有一个接收者能处理该请求;
  • 模式类型:行为型模式;
  • 实现逻辑:每个接收者包含对下一个接收者的引用,若自身无法处理请求,则将其传递给下一个接收者;
  • 参考资料:责任链模式

11. 迭代器模式

  • 核心定义:提供一种遍历聚合对象中所有元素的方法,且不暴露聚合对象的内部结构;
  • 核心优势:分离聚合对象的存储逻辑与遍历逻辑,简化客户端遍历操作。

12. 生产者-消费者模式

  • 核心定义:通过一个固定大小的缓冲区,连接产生数据的生产者和处理数据的消费者,生产者将数据放入缓冲区,消费者从缓冲区取出数据处理;
  • 核心作用:
    1. 平衡生产者与消费者的处理能力(缓冲作用);
    2. 实现生产者与消费者的解耦,降低两者的直接依赖;
  • 参考资料:生产者-消费者模式

参考资料

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容