Skip to content

常用设计模式有什么

常用设计模式概述

  • 定义
  • 设计模式是解决特定问题的可复用方案,总结了面向对象设计中的最佳实践,提升代码可维护性、可扩展性和复用性。
  • 分类(GoF 23 种):
  • 创建型:处理对象创建。
  • 结构型:组织类和对象的关系。
  • 行为型:定义类和对象间的交互。
  • 常用模式
  • 以下列出开发中高频使用的模式(约 10-12 种),并简述其他模式。

核心点

  • 常用模式解决特定问题,Spring 等框架广泛应用。

1. 创建型模式(5 种)

创建型模式关注对象创建,优化内存和性能。

(1) 单例模式(Singleton)

  • 定义
  • 确保类只有一个实例,并提供全局访问点。
  • 场景
  • 配置管理、线程池、数据库连接池。
  • 示例
  • Spring Bean 默认单例。
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return INSTANCE;
    }
}
  • 与您的问题
  • 单点登录(JWT SSO)可使用单例管理认证服务。

(2) 工厂方法(Factory Method)

  • 定义
  • 定义创建接口,子类决定实例化类。
  • 场景
  • 数据库驱动(如 DriverManager)。
  • 示例
  • Spring 的 BeanFactory
interface Product {}
class ConcreteProduct implements Product {}
interface Factory {
    Product create();
}
  • 优点
  • 扩展新产品无需改工厂。

(3) 抽象工厂(Abstract Factory)

  • 定义
  • 创建一系列相关对象的工厂接口。
  • 场景
  • UI 组件(不同主题的按钮、窗口)。
  • 示例
  • Spring 配置多个数据源。
  • 与工厂方法
  • 抽象工厂创建产品族,工厂方法创建单一产品。

(4) 建造者(Builder)

  • 定义
  • 分步构造复杂对象,分离构建和表示。
  • 场景
  • 构建复杂 DTO、配置对象。
  • 示例
  • StringBuilder、Spring Boot 的 WebClient.Builder
public class Builder {
    private String field;
    public Builder setField(String field) {
        this.field = field;
        return this;
    }
    public Product build() {
        return new Product(field);
    }
}

(5) 原型(Prototype)

  • 定义
  • 通过克隆创建对象,减少初始化开销。
  • 场景
  • 对象复制(如深拷贝)。
  • 示例
  • Java 的 Cloneable 接口。
  • 少用
  • 除非克隆性能敏感。

2. 结构型模式(7 种)

结构型模式组织类和对象,优化关系。

(6) 代理模式(Proxy)

  • 定义
  • 为目标对象提供代理,控制访问或增强功能。
  • 场景
  • 日志、权限、延迟加载。
  • 示例
  • Spring AOP 使用代理(您提问的代理模式)。
interface Service {
    void execute();
}
class RealService implements Service {
    public void execute() {}
}
class ProxyService implements Service {
    private RealService real;
    public void execute() {
        System.out.println("Before");
        real.execute();
        System.out.println("After");
    }
}
  • 与您的问题
  • Spring AOP 的动态代理实现切面。

(7) 适配器(Adapter)

  • 定义
  • 将不兼容接口转换为目标接口。
  • 场景
  • 集成旧系统、第三方库。
  • 示例
  • Spring MVC 的 HandlerAdapter
interface Target {
    void request();
}
class Adaptee {
    void specificRequest() {}
}
class Adapter implements Target {
    private Adaptee adaptee;
    public void request() {
        adaptee.specificRequest();
    }
}

(8) 装饰器(Decorator)

  • 定义
  • 动态为对象添加职责,扩展功能。
  • 场景
  • IO 流、权限增强。
  • 示例
  • Java 的 BufferedReader
interface Component {
    void operation();
}
class Decorator implements Component {
    private Component component;
    public void operation() {
        System.out.println("Extra");
        component.operation();
    }
}
  • 与代理
  • 装饰器关注功能叠加,代理关注访问控制。

(9) 外观(Facade)

  • 定义
  • 为复杂子系统提供简化接口。
  • 场景
  • 封装微服务调用。
  • 示例
  • Spring 的 JdbcTemplate

(10) 组合(Composite)

  • 定义
  • 将对象组成树状结构,统一处理个体和整体。
  • 场景
  • 文件系统、组织架构。
  • 示例
  • GUI 组件树。

(11) 桥接(Bridge)

  • 定义
  • 分离抽象和实现,支持独立变化。
  • 场景
  • 驱动程序。
  • 少用
  • 除非抽象和实现频繁变。

(12) 享元(Flyweight)

  • 定义
  • 共享细粒度对象,减少内存。
  • 场景
  • 字符串常量池。
  • 少用
  • 现代内存优化减少需求。

3. 行为型模式(11 种)

行为型模式定义类和对象交互,优化职责分配。

(13) 观察者(Observer)

  • 定义
  • 一对多依赖,对象变化通知观察者。
  • 场景
  • 事件监听、发布订阅。
  • 示例
  • Spring 的 ApplicationEvent
interface Observer {
    void update();
}
class Subject {
    private List<Observer> observers = new ArrayList<>();
    public void addObserver(Observer o) {
        observers.add(o);
    }
    public void notifyObservers() {
        for (Observer o : observers) {
            o.update();
        }
    }
}
  • 与您的问题
  • 单点登录可发布登录事件。

(14) 策略(Strategy)

  • 定义
  • 定义算法族,运行时选择。
  • 场景
  • 排序算法、支付方式。
  • 示例
  • Spring 的 AuthenticationProvider

(15) 模板方法(Template Method)

  • 定义
  • 定义算法骨架,子类实现步骤。
  • 场景
  • 框架回调。
  • 示例
  • Spring 的 JdbcTemplate

(16) 责任链(Chain of Responsibility)

  • 定义
  • 请求沿链传递,直到处理。
  • 场景
  • 过滤器、认证流程。
  • 示例
  • Spring Security 过滤链。
  • 与您的问题
  • JWT 验证可加入责任链。

(17) 命令(Command)

  • 定义
  • 封装请求为对象,支持撤销。
  • 场景
  • 事务日志、任务队列。
  • 示例
  • Spring Batch 的 Job。

(18) 迭代器(Iterator)

  • 定义
  • 顺序访问集合元素。
  • 场景
  • 集合遍历。
  • 示例
  • Java 的 Iterator

(19) 中介者(Mediator)

  • 定义
  • 通过中介协调对象交互。
  • 场景
  • 聊天系统。
  • 少用
  • 除非交互复杂。

(20) 备忘录(Memento)

  • 定义
  • 保存对象状态,支持恢复。
  • 场景
  • 游戏存档。
  • 少用
  • 除非需快照。

(21) 状态(State)

  • 定义
  • 随状态变化行为。
  • 场景
  • 订单状态机。

(22) 访问者(Visitor)

  • 定义
  • 分离操作和对象结构。
  • 场景
  • AST 处理。
  • 少用
  • 除非结构固定。

(23) 解释器(Interpreter)

  • 定义
  • 定义语言语法,解释执行。
  • 场景
  • SQL 解析。
  • 少用
  • 除非需自定义语言。

4. 常用模式总结

高频模式(12 种)

  • 创建型:单例、工厂方法、抽象工厂、建造者。
  • 结构型:代理、适配器、装饰器、外观。
  • 行为型:观察者、策略、模板方法、责任链。
  • 原因
  • 这些模式简单、通用,广泛用于框架和业务。

Spring 中的应用

  • 单例:Bean 默认单例。
  • 代理:AOP 动态代理(您提问)。
  • 工厂BeanFactory
  • 观察者:事件机制。
  • 责任链:过滤器链。

5. 选择建议

  • 简单优先:用单例、代理解决小问题。
  • 框架集成:Spring 内置模式(如 AOP、工厂)。
  • 避免过度设计:复杂模式(如访问者)谨慎用。

6. 延伸与面试角度

  • 与您的问题
  • 代理模式:Spring AOP 核心(已详述)。
  • 单点登录:观察者发布登录事件,责任链验证 JWT。
  • 线程安全:单例需加锁(如双检锁)。
  • 实际应用
  • 电商:策略(支付方式)、观察者(订单通知)。
  • 微服务:外观(API 网关)、适配器(异构系统)。
  • 面试点
  • 问“常用”时,分三类提 10+ 种。
  • 问“场景”时,结合 Spring 示例。

7. 总结

常用设计模式包括单例、工厂、代理、观察者等 12 种,覆盖创建、结构、行为三类,广泛用于 Spring(AOP、Bean 管理)和业务开发(如 JWT 验证)。代理模式与您的问题高度相关,Spring AOP 是典型实现。面试时,可分类讲解,结合代码或框架,展示理解深度。


如果您想深入某模式(如代码实现)或有具体场景,请告诉我,我可以进一步优化!