Java 常用设计模式实战

设计模式不是玄学,是前人总结的代码组织最佳实践。本文挑 4 个最常用的设计模式,用实战例子讲清什么时候用、怎么写。

Java 设计模式配图:蓝色渐变背景上互锁拼图块组成整体结构,蓝图网格背景,扁平科技插画
设计模式:可复用的代码组织方案

一、单例模式

整个应用只有一个实例,比如配置管理器、日志器、数据库连接池。

// 饿汉式:类加载时就创建
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 种模式,而是理解"针对什么问题、用什么结构解决"。最常用的是单例(全局唯一)、工厂(条件创建)、观察者(事件通知)、策略(算法切换)。不要为了用模式而用模式,简单场景直接写代码就行,模式是在重构中自然浮现的。