Skip to content

设计模式面试题

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) {
        // 支付宝支付
    }
}