在 Java 项目开发中,以下 6 种设计模式因实用性强、应用场景广泛而被高频使用:
用途:确保一个类仅有一个实例,并提供全局访问点。场景:线程池、数据库连接池、配置类、日志工具等需要全局唯一实例的场景。实现方式:饿汉式、懒汉式(双重检查锁)、静态内部类、枚举(推荐,天然防止反射和序列化破坏)。
// 枚举单例(最佳实践)
public enum Singleton {
INSTANCE;
public void doSomething() { ... }
}
分类:简单工厂、工厂方法、抽象工厂。用途:封装对象创建逻辑,解耦对象实例化与使用。场景:对象创建复杂(如参数多、依赖多)、需要灵活切换产品类型时(如数据库驱动切换、日志框架适配)。
// 工厂方法示例
public interface LoggerFactory {
Logger createLogger();
}
public class FileLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() { return new FileLogger(); }
}
用途:定义对象间一对多依赖,当一个对象状态变化时,所有依赖者自动收到通知。场景:事件监听(如 GUI 按钮点击)、消息订阅、Spring 的事件机制(ApplicationEvent)、RxJava 响应式编程。
// JDK自带观察者接口
public class Subject extends Observable {
public void changeState() {
setChanged();
notifyObservers(); // 通知观察者
}
}
public class ObserverImpl implements Observer {
@Override
public void update(Observable o, Object arg) { ... }
}
用途:动态给对象添加功能,避免继承带来的类爆炸。场景:IO 流(BufferedReader装饰FileReader)、Spring 的TransactionProxy、MyBatis 的缓存装饰器。
// IO中的装饰器示例
Reader reader = new BufferedReader(new FileReader("file.txt"));
用途:将一个类的接口转换成客户端期望的另一个接口,解决接口不兼容问题。场景:集成第三方组件(接口不匹配)、旧系统改造(适配新接口)、SpringMVC 的HandlerAdapter。
// 类适配器示例
public interface Target { void request(); }
public class Adaptee { public void specificRequest() { ... } }
public class Adapter extends Adaptee implements Target {
@Override
public void request() { specificRequest(); }
}
分类:静态代理、动态代理(JDK 动态代理、CGLIB)。用途:控制对象访问,增强功能(如日志、事务、权限)。场景:Spring AOP(基于动态代理)、MyBatis 的 Mapper 代理、RPC 框架的远程代理。
// JDK动态代理示例
public class ProxyHandler implements InvocationHandler {
private Object target;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 增强逻辑(如日志)
return method.invoke(target, args);
}
}
这些模式覆盖了对象创建、行为扩展、接口适配、依赖管理等核心场景,是 Java 开发中解决常见问题的 “利器”。实际项目中,Spring、MyBatis 等框架也大量运用了这些模式,掌握它们能显著提升代码的可维护性和扩展性。