常用设计模式有什么
常用设计模式概述
- 定义:
- 设计模式是解决特定问题的可复用方案,总结了面向对象设计中的最佳实践,提升代码可维护性、可扩展性和复用性。
- 分类(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 是典型实现。面试时,可分类讲解,结合代码或框架,展示理解深度。
如果您想深入某模式(如代码实现)或有具体场景,请告诉我,我可以进一步优化!