深入解读五种常见 Java 设计模式及其在 Spring 框架中的应用
-
1.1 设计模式简介
在软件开发过程中,设计模式是一套针对常见问题的可复用解决方案。它们并非具体的代码片段,而是总结和提炼出的最佳实践,旨在提升代码的可读性、可维护性和扩展性。
设计模式的核心思想在于封装变化、抽象共性和遵循开闭原则。掌握这些模式,不仅能够帮助开发者高效解决复杂业务场景,还可以更好地理解优秀框架(如 Spring、MyBatis 等)的设计思想。
1.2 设计模式分类
根据 “Gang of Four (GoF)” 设计模式理论,设计模式主要分为以下三类:
- 创建型模式:控制对象创建的方式,隐藏复杂的实例化逻辑,提高代码的灵活性。
- 常见模式:单例模式、工厂模式、建造者模式等。
- 结构型模式:描述类和对象之间的组合关系,帮助系统更具模块化和松耦合性。
- 常见模式:代理模式、适配器模式、装饰器模式等。
- 行为型模式:描述对象间的交互方式和职责划分,提高系统的可扩展性和可维护性。
- 常见模式:策略模式、模板方法模式、观察者模式等。
1.3 引出问题
在日常开发中,我们会遇到以下场景:
- 需要动态创建不同类型的对象,而不暴露具体实现细节。
- 为方法调用添加事务、安全检查或日志记录等功能,而不修改原始方法代码。
- 使用不同的算法策略来处理不同类型的请求。
这些场景在复杂项目中非常普遍,因此,学习并掌握设计模式能够帮助开发者设计出更加优雅、健壮的代码架构。
- 创建型模式:控制对象创建的方式,隐藏复杂的实例化逻辑,提高代码的灵活性。
2.1 工厂模式(Factory Pattern)
模式简介
工厂模式是创建型模式之一,它通过定义一个工厂类来负责创建对象,而不是由客户端直接实例化对象,从而实现对象创建与使用的解耦。
模式结构
- 产品接口:定义创建对象的标准接口或抽象类。
- 具体产品类:实现产品接口,表示实际创建的对象。
- 工厂类:封装对象的创建逻辑,对外提供方法创建不同类型的产品实例。
使用场景
- 当对象的创建逻辑较为复杂时,通过工厂模式简化对象创建过程。
- 当需要创建不同类型的对象,并根据参数或配置文件决定创建哪种对象时。
Java 示例代码
需求描述:一个汽车工厂可以创建不同类型的汽车(如 BMW、Audi)
// 产品接口,定义汽车的行为
public interface Car {
void drive(); // 驾驶方法
}
// 具体产品类:宝马车
public class BMW implements Car {
@Override
public void drive() {
System.out.println("驾驶宝马汽车...");
}
}
// 具体产品类:奥迪车
public class Audi implements Car {
@Override
public void drive() {
System.out.println("驾驶奥迪汽车...");
}
}
// 工厂类:封装创建逻辑
public class CarFactory {
/**
* 根据传入的类型创建汽车实例
*
* @param type 汽车类型(BMW或Audi)
* @return 汽车实例
*/
public static Car createCar(String type) {
if ("BMW".equalsIgnoreCase(type)) {
return new BMW();
} else if ("Audi".equalsIgnoreCase(type)) {
return new Audi();
} else {
throw new IllegalArgumentException<