Java 常用设计模式实战
设计模式不是玄学,是前人总结的代码组织最佳实践。本文挑 4 个最常用的设计模式,用实战例子讲清什么时候用、怎么写。
一、单例模式
整个应用只有一个实例,比如配置管理器、日志器、数据库连接池。
// 饿汉式:类加载时就创建
public class ConfigManager {
private static final ConfigManager INSTANCE = new ConfigManager();
private ConfigManager() {}
public static ConfigManager getInstance() { return INSTANCE; }
}
// 双检锁:延迟加载 + 线程安全
public class Logger {
private static volatile Logger instance;
private Logger() {}
public static Logger getInstance() {
if (instance == null) {
synchronized (Logger.class) {
if (instance == null) {
instance = new Logger();
}
}
}
return instance;
}
}
现代写法:Java 17+ 推荐用 enum 实现单例,线程安全且防反射攻击。Spring Boot 中的 Bean 默认就是单例的。
二、工厂模式
根据条件创建不同对象,避免在代码里到处 new。
// 产品接口
interface Notification {
void send(String message);
}
class EmailNotification implements Notification {
public void send(String message) { System.out.println("邮件:" + message); }
}
class SmsNotification implements Notification {
public void send(String message) { System.out.println("短信:" + message); }
}
// 工厂
class NotificationFactory {
public static Notification create(String type) {
return switch (type) {
case "email" -> new EmailNotification();
case "sms" -> new SmsNotification();
default -> throw new IllegalArgumentException("未知类型:" + type);
};
}
}
// 使用
Notification n = NotificationFactory.create("email");
n.send("系统通知");
三、观察者模式
事件发生时自动通知所有订阅者,Spring 的事件机制就是观察者模式。
import java.util.ArrayList;
import java.util.List;
interface Observer {
void update(String event);
}
class EventSource {
private List observers = new ArrayList<>();
public void subscribe(Observer o) { observers.add(o); }
public void fire(String event) {
observers.forEach(o -> o.update(event));
}
}
// 使用
EventSource source = new EventSource();
source.subscribe(event -> System.out.println("处理事件:" + event));
source.fire("订单创建");
四、策略模式
把可替换的算法封装成独立类,运行时切换。
interface DiscountStrategy {
double discount(double price);
}
class NoDiscount implements DiscountStrategy {
public double discount(double price) { return price; }
}
class VipDiscount implements DiscountStrategy {
public double discount(double price) { return price * 0.8; }
}
class BlackFridayDiscount implements DiscountStrategy {
public double discount(double price) { return price * 0.5; }
}
class Order {
private DiscountStrategy strategy;
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double finalPrice(double price) {
return strategy.discount(price);
}
}
// 使用
Order order = new Order();
order.setStrategy(new BlackFridayDiscount());
System.out.println(order.finalPrice(100)); // 50.0
五、模式选型速查
| 场景 | 推荐模式 |
|---|---|
| 全局唯一实例 | 单例 |
| 根据条件创建不同对象 | 工厂 |
| 事件触发通知多个组件 | 观察者 |
| 算法可互换 | 策略 |
| 简化复杂子系统调用 | 外观 |
六、Spring 中的设计模式
Spring 框架本身就是设计模式的集大成者:Bean 是单例、FactoryBean 是工厂、ApplicationEvent 是观察者、JdbcTemplate 是模板方法、代理 AOP 是代理模式。学 Spring 的时候对照设计模式理解,会通透很多。
七、总结
设计模式的核心不是背 23 种模式,而是理解"针对什么问题、用什么结构解决"。最常用的是单例(全局唯一)、工厂(条件创建)、观察者(事件通知)、策略(算法切换)。不要为了用模式而用模式,简单场景直接写代码就行,模式是在重构中自然浮现的。