设计模式面试题
1. 单例模式的几种实现方式?
饿汉式
java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}双重检查锁(DCL)
java
public 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;
}
}为什么用 volatile? 防止指令重排序。new Singleton() 不是原子操作,分为分配内存、初始化对象、引用指向内存三步,可能发生重排序导致返回未初始化的对象。
静态内部类
java
public class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}枚举(最安全)
java
public enum Singleton {
INSTANCE;
}2. 代理模式在 Spring 中的应用?
Spring AOP 基于代理模式实现:
- 被代理类有接口 → JDK 动态代理(
Proxy.newProxyInstance) - 被代理类无接口 → CGLIB 代理(生成子类)
Spring 事务管理也使用了代理模式,通过 AOP 代理在方法执行前后开启和提交事务。
3. 工厂模式在 Spring 中的应用?
- 简单工厂:
BeanFactory根据 Bean 名称获取实例 - 工厂方法:
FactoryBean接口,由子类决定创建什么对象
4. 观察者模式在 Spring 中的应用?
Spring 事件机制基于观察者模式:
ApplicationEvent:事件对象ApplicationListener:事件监听器(观察者)ApplicationEventPublisher:事件发布者
5. 策略模式在实际开发中的应用?
- 不同支付方式(微信、支付宝、银行卡)
- 不同消息推送渠道(短信、邮件、App 推送)
- Spring 中
InstantiationStrategy(实例化策略)
java
// 策略模式示例
public interface PayStrategy {
void pay(BigDecimal amount);
}
@Component("wechatPay")
public class WechatPay implements PayStrategy {
public void pay(BigDecimal amount) {
// 微信支付
}
}
@Component("alipay")
public class Alipay implements PayStrategy {
public void pay(BigDecimal amount) {
// 支付宝支付
}
}