设计模式
背景
废话少说,面试常问的直接端上来
一些知识点
一、单例模式
- 实现方式与线程安全
饿汉式:类加载时初始化实例,线程安全但可能浪费资源1
2
3
4
5public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() { return INSTANCE; }
}
- 双重检查锁:延迟加载且线程安全,需用
volatile
防止指令重排序 136枚举实现:Java5+推荐方式,天然线程安全且防反射攻击1
2
3
4
5
6
7
8
9
10
11
12public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) instance = new Singleton();
}
}
return instance;
}
}
- 应用场景
频繁创建/销毁的对象(如线程池、数据库连接池)
需要全局唯一访问点的配置管理类
二、工厂模式
1. 分类与核心思想
简单工厂:通过参数动态创建对象,但违反开闭原则
public class CoffeeFactory {
public static Coffee createCoffee(String type) {
if (“Latte”.equals(type)) return new Latte();
else if (“Americano”.equals(type)) return new Americano();
throw new IllegalArgumentException(“Invalid type”);
}
}
2. JDK应用示例
三、代理模式
1. 类型与实现
- 静态代理:手动编写代理类,如AOP切面 14
- 动态代理:
- JDK动态代理:基于接口,通过
InvocationHandler
实现(如Motan RPC) 14 - CGLIB代理:基于继承,无需接口(如Spring AOP) 36
2. 应用场景
四、观察者模式
1. 结构与实现
2. 优缺点
五、适配器模式
1. 类型与场景
2. 典型应用
六、装饰模式
1. 特点与实现
- 动态扩展对象功能:通过组合替代继承 26
- JDK示例:Java IO的
BufferedReader
装饰FileReader
561
Reader reader = new BufferedReader(new FileReader("file.txt"));
七、模板方法模式
- 核心思想
定义算法骨架:子类重写特定步骤(如JdbcTemplate)1
2
3
4
5
6
7
8
9
10public abstract class AbstractTemplate {
public void process() {
step1();
step2(); // 子类实现
step3();
}
private void step1() { /*...*/ }
protected abstract void step2();
private void step3() { /*...*/ }
}
八、高频进阶问题
- 设计模式分类:
- 创建型(5种):单例、工厂、建造者等
- 结构型(7种):代理、适配器、装饰者等
- 行为型(11种):观察者、策略、模板方法等
- 设计原则:
- 开闭原则、里氏替换原则、依赖倒置原则等
- 框架中的应用:
- Spring的单例Bean、AOP代理
- MyBatis的Executor模板方法