- 单一职责原则:一个类只负责一项职责
- 开闭原则:对扩展开放,对修改关闭
- 里氏替换原则:子类可以替换父类
- 接口隔离原则:使用多个专门接口
- 依赖倒置原则:依赖抽象而非具体实现
- 迪米特法则:最少知识原则
- 创建型:单例、工厂、建造者、原型
- 结构型:代理、适配器、装饰器、外观、组合、桥接、享元
- 行为型:策略、观察者、模板方法、责任链、状态、命令、迭代器、中介者、备忘录、访问者、解释器
- 饿汉式:类加载时创建
- 懒汉式:首次使用时创建
- 双重检查锁:线程安全的懒汉式
- 静态内部类:延迟加载,线程安全
- 枚举:最佳实践,防止反射攻击
防止指令重排。instance = new Singleton() 分三步:
- 分配内存
- 初始化对象
- 将引用指向内存
没有 volatile,可能发生 1→3→2 的重排,导致其他线程获取到未初始化的对象。
| 模式 | 特点 |
|---|
| 简单工厂 | 一个工厂创建所有产品 |
| 工厂方法 | 每个产品一个工厂 |
| 抽象工厂 | 创建产品族 |
- 工厂模式:关注创建单个产品
- 建造者模式:关注创建复杂对象,分步骤构建
| 特性 | 代理模式 | 装饰器模式 |
|---|
| 目的 | 控制访问 | 增强功能 |
| 关系 | 代理类控制目标类 | 装饰器增强被装饰对象 |
| 创建 | 代理类创建目标对象 | 装饰器接收被装饰对象 |
| 特性 | JDK 动态代理 | CGLIB |
|---|
| 实现方式 | 基于接口 | 基于继承 |
| 要求 | 目标类实现接口 | 目标类不能是 final |
| 性能 | 创建快,调用慢 | 创建慢,调用快 |
- 适配器模式:将一个接口转换成另一个接口
- 外观模式:为子系统提供统一接口
Java IO 流:
InputStream is = new FileInputStream("file.txt");
is = new BufferedInputStream(is);
is = new DataInputStream(is);
| 特性 | 策略模式 | 状态模式 |
|---|
| 关注点 | 算法的选择 | 状态的转换 |
| 切换方式 | 客户端选择策略 | 状态自动转换 |
| 状态感知 | 策略不感知其他策略 | 状态感知其他状态 |
Spring 事件机制:
ApplicationEvent:事件ApplicationEventPublisher:发布者@EventListener:监听者
JdbcTemplateRestTemplateRedisTemplate
- Servlet Filter 链
- Spring Interceptor 链
- Netty ChannelPipeline
| 模式 | 应用 |
|---|
| 工厂模式 | BeanFactory |
| 单例模式 | Bean 默认单例 |
| 代理模式 | AOP |
| 模板方法 | JdbcTemplate |
| 观察者模式 | 事件机制 |
| 适配器模式 | HandlerAdapter |
| 装饰器模式 | BeanWrapper |
| 策略模式 | Resource 接口 |
| 模式 | 应用 |
|---|
| 工厂模式 | SqlSessionFactory |
| 建造者模式 | SqlSessionFactoryBuilder |
| 代理模式 | Mapper 接口代理 |
| 模板方法 | BaseExecutor |
| 装饰器模式 | Cache 装饰器 |
- 分析问题,识别变化点
- 根据设计原则选择模式
- 不要过度设计
- 优先使用组合而非继承
- 简单问题不需要复杂方案
- 需求不明确时
- 团队不熟悉时
- 性能敏感场景
- 理解业务需求
- 识别代码坏味道
- 选择合适的模式重构
- 保持简单,避免过度设计