在Java开发中,设计模式是解决常见问题的经典方案,能提升代码的可维护性、扩展性和复用性,下面从专业角度详解Java类设计模式的核心内容,结合代码示例说明实际应用。
设计模式的重要性
设计模式是经验总结的编程范式,由GoF(Gang of Four)在《设计模式:可复用面向对象软件的基础》中系统化提出,其价值在于:
- 降低耦合度:模块间依赖最小化
- 提升代码复用:避免重复造轮子
- 增强系统灵活性:适应需求变化
- 标准化设计:团队协作更高效
设计模式分类及典型实现
创建型模式(管理对象创建)
单例模式(Singleton)
确保类只有一个实例,全局可访问。
public class Singleton { private static volatile Singleton instance; private Singleton() {} // 私有构造 public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
- 应用场景:数据库连接池、日志处理器
- 优点:节省内存资源
- 缺点:单元测试困难(需Mock静态实例)
工厂方法模式(Factory Method)
将对象创建委托给子类。
interface Shape { void draw(); } class Circle implements Shape { @Override public void draw() { System.out.println("绘制圆形"); } } class ShapeFactory { public Shape createShape(String type) { if ("circle".equals(type)) return new Circle(); // 扩展其他形状 return null; } }
- 应用场景:JDBC连接器、Spring BeanFactory
- 优点:符合开闭原则,新增类型无需修改工厂
结构型模式(组合对象形成结构)
适配器模式(Adapter)
兼容不兼容接口。
class LegacyPrinter { void printDocument() { /* 旧式打印 */ } } interface ModernPrinter { void print(); } class PrinterAdapter implements ModernPrinter { private LegacyPrinter legacyPrinter; public PrinterAdapter(LegacyPrinter printer) { this.legacyPrinter = printer; } @Override public void print() { legacyPrinter.printDocument(); // 适配调用 } }
- 应用场景:旧系统整合、第三方库适配
代理模式(Proxy)
控制对象访问。
interface Image { void display(); } class RealImage implements Image { @Override public void display() { /* 加载大图 */ } } class ProxyImage implements Image { private RealImage realImage; @Override public void display() { if (realImage == null) { realImage = new RealImage(); // 延迟加载 } realImage.display(); } }
- 应用场景:Spring AOP、远程方法调用(RMI)
行为型模式(对象间通信)
观察者模式(Observer)
一对多依赖通知。
import java.util.ArrayList; import java.util.List; abstract class Subject { private List<Observer> observers = new ArrayList<>(); void attach(Observer o) { observers.add(o); } void notifyAll(String message) { for (Observer o : observers) { o.update(message); } } } interface Observer { void update(String message); } class User implements Observer { @Override public void update(String msg) { System.out.println("收到通知: " + msg); } }
- 应用场景:事件驱动系统、消息队列订阅
- 优点:解耦发布者与订阅者
策略模式(Strategy)
动态切换算法。
interface PaymentStrategy { void pay(int amount); } class CreditCardPay implements PaymentStrategy { @Override public void pay(int amount) { /* 信用卡支付逻辑 */ } } class PaymentContext { private PaymentStrategy strategy; public void setStrategy(PaymentStrategy strategy) { this.strategy = strategy; } public void executePay(int amount) { strategy.pay(amount); } }
- 应用场景:支付方式切换、排序算法选择
设计模式选择原则
-
识别问题本质
- 创建对象复杂 → 工厂/建造者模式
- 接口不兼容 → 适配器模式
- 状态变化通知 → 观察者模式
-
避免过度设计
- 简单场景直接实例化对象(而非工厂)
- 单例滥用会导致全局状态污染
-
结合框架特性
- Spring中的依赖注入(DI)天然实现单例和工厂
- MyBatis使用代理模式生成Mapper接口实现
反模式警示
- 上帝对象(God Object):单个类承担过多职责 → 拆分为多个类+组合模式
- 循环依赖:A依赖B,B依赖A → 引入中介者模式或事件总线
- 硬编码条件分支:大量if/else → 用策略模式+工厂重构
实际应用建议
- 重构时机:当发现代码频繁修改相同逻辑时引入模式
- 性能考量:代理模式可能增加调用链深度
- 团队共识:统一模式命名(如
XXXStrategy
)提升可读性
权威引用:
- Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley.
- Oracle官方Java设计模式教程:https://docs.oracle.com/javase/tutorial/extra/certification/designpatterns.html
- Martin Fowler《重构:改善既有代码的设计》
设计模式是工具而非目标,合理运用能显著提升工程质量,但需结合具体场景,建议通过开源项目(如Spring Framework)学习模式的实际应用,并定期进行代码评审优化设计。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/32352.html