装饰者模式、静态代理、类适配器对比

核心意图动态扩展功能,通过嵌套装饰器的方式为对象添加新行为(强调“增强”而非控制)

维度

静态代理

装饰者

类适配器

核心目的

控制访问(隐藏/保护)

动态扩展功能

接口转换(兼容性)

关系

代理类和目标类独立

装饰器和原始类可嵌套

适配器“继承+实现”

调用方感知

知道代理存在(可能隐藏细节)

不知道装饰存在(透明扩展)

不知道适配存在

典型应用

AOP、远程代理

I/O流、Spring Transaction

旧系统改造、第三方库适配

简单工厂、抽象工厂对比

1. 简单工厂模式(Simple Factory)

  • 核心意图
    提供一个统一的工厂类,根据输入条件决定创建哪种具体产品
    (本质是将对象的实例化逻辑集中管理,避免客户端直接 new 具体类。)

2. 抽象工厂模式(Abstract Factory)

  • 核心意图
    提供一个接口,用于创建相关或依赖对象的家族(一组产品),而不需指定具体类。
    (强调产品族的整体创建,例如 GUI 中的“跨平台按钮+文本框”组合。)

维度

简单工厂模式

抽象工厂模式

设计层次

单一产品创建

产品族创建(一组关联产品)

扩展性

违反开闭原则(需修改工厂类)

支持产品族扩展(新增工厂类)

复杂度

简单

复杂(需设计多层级接口)

适用场景

产品类型少且变化不频繁

系统需要多套独立的产品组合(如跨平台)

动态代理的核心原理

动态代理依赖于以下两个核心组件

  • InvocationHandler 接口:定义代理对象的增强逻辑(如前置/后置处理)。

  • Proxy:通过反射动态生成代理类实例。

动态代理 vs 静态代理

对比点

静态代理

动态代理

实现方式

手动编写代理类

运行时自动生成代理类

灵活性

一个代理类只能代理一种接口

一个动态代理类可代理多个接口

适用场景

简单场景

AOP、框架级扩展(如Spring事务)

CGLIB 核心原理

  • 继承目标类:CGLIB 通过生成目标类的子类来代理,重写父类方法。

  • 方法拦截:通过 MethodInterceptor 接口实现方法增强(类似 JDK 的 InvocationHandler)。

  • 性能优化:CGLIB 通过 FastClass 机制直接调用方法,比反射效率更高。

CGLIB vs JDK 动态代理

对比点

JDK 动态代理

CGLIB 动态代理

代理方式

基于接口(Proxy + InvocationHandler

基于继承(生成子类)

目标类要求

必须实现接口

可代理普通类(无需接口)

性能

反射调用,略慢

字节码直接调用,更快

应用场景

Spring AOP(默认接口代理)

Spring AOP(配置为 CGLIB 时)

组合模式(Composite Pattern)详解

组合模式(Composite Pattern)是一种 结构型设计模式,它允许你将对象组合成 树形结构 来表示“部分-整体”的层次关系,使得客户端可以 统一处理单个对象和组合对象

1. 组合模式的核心思想

  • 统一对待:客户端无需区分操作的是 单个对象(叶子节点)还是 组合对象(容器节点)。

  • 递归结构:组合对象可以包含其他组合对象或叶子对象,形成树形结构。

  • 透明性:叶子节点和容器节点实现相同的接口,客户端调用方式一致。

适用场景

  • 需要表示 部分-整体 的层次结构(如文件系统、菜单树、UI 组件)。

  • 希望客户端 忽略组合对象与单个对象的差异

组合模式 vs 其他模式

模式

区别

装饰者模式

动态添加功能,而组合模式是构建树形结构。

桥接模式

分离抽象与实现,组合模式是处理部分-整体关系。

访问者模式

将操作与结构分离,组合模式是统一处理叶子与容器。

享元模式(Flyweight Pattern)详解

享元模式(Flyweight Pattern)是一种 结构型设计模式,它通过 共享对象 来减少内存使用,特别适合处理大量细粒度对象的场景。

1. 享元模式的核心思想

  • 共享对象:将对象的 可共享部分(内部状态)不可共享部分(外部状态) 分离。

  • 减少内存:通过复用共享对象,避免重复创建相似对象。

  • 轻量化:适合处理海量小对象(如字符、图形、游戏粒子)。

适用场景

  • 系统需要创建 大量相似对象,导致内存消耗过高。

  • 对象的大部分状态可以 外部化(由客户端传递)。

  • 应用不依赖对象标识(即不关心对象是否是同一个实例)。

2.享元模式 vs 其他模式

模式

区别

单例模式

单例确保全局唯一对象,享元模式是共享多个相似对象。

原型模式

通过克隆生成新对象,享元模式是复用现有对象。

对象池

对象池管理生命周期,享元模式关注状态分离。

往期文章:

https://blog.forminio.cn/archives/she-ji-mo-shi