23种设计模式
创建型模式(5种)- 解决"怎么创建对象"
| 模式名称 | 核心实现思路(一句话说清怎么做) | Java / Spring 经典应用 |
|---|---|---|
| 单例模式 (Singleton) | 私有构造器 + 静态方法返回唯一实例(双重检查锁 / 静态内部类 / 枚举) | Runtime.getRuntime();Spring Bean 默认单例池 |
| 工厂方法 (Factory Method) | 定义抽象工厂方法,子类重写该方法返回具体产品 | Calendar.getInstance();Spring FactoryBean.getObject() |
| 抽象工厂 (Abstract Factory) | 定义多个工厂方法分别创建一族产品,具体工厂实现这一族产品的创建 | Connection 创建 Statement / PreparedStatement;Spring JdbcFactory |
| 建造者模式 (Builder) | 链式调用设置可选参数,最后调用 build() 一次性构造复杂对象 |
StringBuilder.append().toString();RestTemplate 构建器 |
| 原型模式 (Prototype) | 实现 Cloneable 接口并重写 clone(),用拷贝代替 new 创建对象 |
实现 Cloneable;Spring @Scope("prototype") 每次返回新实例 |
结构型模式(7种)- 解决"怎么组合类/对象"
| 模式名称 | 核心实现思路(一句话说清怎么做) | Java / Spring 经典应用 |
|---|---|---|
| 适配器模式 (Adapter) | 持有被适配者引用,在目标接口方法中调用被适配者的方法进行转换 | InputStreamReader(字节→字符);Spring AdvisorAdapter 适配通知 |
| 桥接模式 (Bridge) | 抽象类持有实现接口的引用,两者各自独立扩展,运行时组合 | DriverManager 持有 Driver 实现;JDBC 驱动架构 |
| 组合模式 (Composite) | 叶子节点和容器节点实现同一接口,容器节点内部持有子节点集合 | AWT 的 Container / Component;Spring WebMvcConfigurer 组合配置 |
| 装饰模式 (Decorator) | 装饰类持有被装饰对象的引用,在调用原方法前后 / 增强执行额外逻辑 | BufferedInputStream 包裹 FileInputStream;Spring TransactionAwareCacheDecorator |
| 外观模式 (Facade) | 创建一个门面类,内部调用多个子系统的复杂方法,对外只暴露简单方法 | Spring MVC 的 DispatcherServlet 统一处理请求流程 |
| 享元模式 (Flyweight) | 维护一个对象池,先从池中取,取不到再创建并放入池中复用 | Integer.valueOf() 缓存(-128~127);Spring 字符串常量池 |
| 代理模式 (Proxy) | 代理类持有目标对象引用,在调用目标方法前后执行增强逻辑(JDK动态代理实现接口 / CGLIB继承子类) | Spring AOP 的 JdkDynamicAopProxy / CglibAopProxy |
行为型模式(11种)- 解决"对象间怎么交互"
| 模式名称 | 核心实现思路(一句话说清怎么做) | Java / Spring 经典应用 |
|---|---|---|
| 策略模式 (Strategy) | 定义策略接口,不同策略类实现该接口,使用时通过 setter / 构造器注入具体策略并调用 | Comparator 接口;Spring Resource 不同实现(ClassPathResource / FileSystemResource) |
| 模板方法 (Template Method) | 抽象父类定义算法骨架(模板方法),具体步骤声明为抽象方法由子类实现 | JdbcTemplate 定义流程,回调接口执行具体 SQL;RestTemplate |
| 观察者模式 (Observer) | 被观察者维护观察者列表,状态变化时遍历列表通知所有观察者 | Spring 事件机制:ApplicationEventPublisher 发布事件,@EventListener 监听 |
| 迭代器模式 (Iterator) | 集合内部维护游标,提供 hasNext() 和 next() 方法顺序遍历元素 |
java.util.Iterator 接口及所有 Collection 的实现 |
| 责任链模式 (Chain) | 每个处理器持有下一个处理器的引用,请求沿链传递,直到被某个处理器处理 | Servlet FilterChain;Spring Security 过滤器链 |
| 命令模式 (Command) | 将请求封装成命令对象,命令对象持有接收者引用,调用命令的 execute() 触发实际执行 |
Runnable 接口;JdbcTemplate 执行 SQL |
| 状态模式 (State) | 上下文持有当前状态对象,状态变化时替换状态对象,行为委托给当前状态执行 | Spring StateMachine 状态机;订单状态流转 |
| 备忘录模式 (Memento) | 发起者创建包含内部状态的备忘录对象,由管理者保存,需要时用备忘录恢复 | Serializable 序列化保存状态;Spring Web Flow 状态保存与恢复 |
| 中介者模式 (Mediator) | 所有对象只与中介者通信,中介者封装对象间的交互逻辑 | DispatcherServlet 协调 Controller / Model / View;消息中间件 |
| 解释器模式 (Interpreter) | 定义抽象表达式接口,终结符 / 非终结符表达式类实现,构建语法树后调用解释方法 | Pattern 正则解析;Spring SpEL 表达式求值 |
| 访问者模式 (Visitor) | 元素类定义 accept(visitor) 方法,visitor 为每个元素定义不同的访问方法,双重分派 |
NIO FileVisitor;Spring BeanDefinitionVisitor 遍历 Bean 定义 |
快速记忆口诀
| 类型 | 口诀 | 模式列表 |
|---|---|---|
| 创建型(5个) | 单工建原抽 | 单例、工厂方法、建造者、原型、抽象工厂 |
| 结构型(7个) | 适桥组装外享代 | 适配器、桥接、组合、装饰、外观、享元、代理 |
| 行为型(11个) | 策模观迭责,命状备中解访 | 策略、模板方法、观察者、迭代器、责任链、命令、状态、备忘录、中介者、解释器、访问者 |