Java 中常用的设计模式可分为三大类
Java 中常用的设计模式可分为三大类:创建型模式、结构型模式和行为型模式。以下是各类中最常用的设计模式及其应用场景:
一、创建型模式(Creational Patterns)
专注于对象创建机制,隐藏创建逻辑,使代码更灵活。
-
单例模式(Singleton)
- 特点:确保一个类只有一个实例,并提供全局访问点。
- 应用:日志工具、配置管理器、线程池等。
- 实现:懒汉式(延迟初始化)、饿汉式(预初始化)、枚举单例(线程安全)。
public class Singleton {// 饿汉式(线程安全)private static final Singleton INSTANCE = new Singleton();private Singleton() {} // 私有构造防止实例化public static Singleton getInstance() { return INSTANCE; } }
-
工厂模式(Factory)
- 简单工厂:通过一个工厂类创建不同类型的对象(违反开闭原则)。
- 工厂方法:定义创建对象的接口,由子类决定实例化哪个类(符合开闭原则)。
- 抽象工厂:创建一系列相关或依赖的对象,无需指定具体类。
- 应用:日志记录器(创建不同类型的日志对象)、数据库连接工厂。
-
建造者模式(Builder)
- 特点:分步构建复杂对象,分离构建与表示。
- 应用:StringBuilder、OkHttp 的请求构建、POJO 复杂对象创建。
public class User {private final String name;private final int age;private User(Builder builder) {this.name = builder.name;this.age = builder.age;}public static class Builder {private String name;private int age;public Builder name(String name) { this.name = name; return this; }public Builder age(int age) { this.age = age; return this; }public User build() { return new User(this); }} } // 使用:new User.Builder().name("Alice").age(20).build()
-
原型模式(Prototype)
- 特点:通过复制现有对象创建新对象,避免重复初始化。
- 应用:复杂对象的复制(如 Spring 的
BeanUtils.copyProperties
)。
二、结构型模式(Structural Patterns)
处理类或对象的组合,实现更灵活的结构。
-
代理模式(Proxy)
- 特点:为对象提供代理类,控制对原对象的访问。
- 应用:远程代理(RPC)、延迟加载(MyBatis 懒加载)、AOP 增强(Spring AOP)。
-
装饰器模式(Decorator)
- 特点:动态给对象添加额外功能,不改变原类结构。
- 应用:Java IO 流(如
BufferedReader
装饰FileReader
)。
// 装饰器示例:给咖啡加奶 public interface Coffee { String getDescription(); double cost(); } public class SimpleCoffee implements Coffee { ... } public class MilkDecorator implements Coffee {private Coffee coffee;public MilkDecorator(Coffee coffee) { this.coffee = coffee; }public String getDescription() { return coffee.getDescription() + ", Milk"; }public double cost() { return coffee.cost() + 1.0; } }
-
适配器模式(Adapter)
- 特点:将一个类的接口转换为另一个接口,使不兼容的类可协同工作。
- 应用:Java 的
InputStreamReader
(将字节流适配为字符流)、旧系统接口适配新接口。
-
组合模式(Composite)
- 特点:将对象组合成树形结构,统一处理单个对象和组合对象。
- 应用:文件系统(文件和文件夹的统一操作)、UI 组件树(如 Swing 的
Container
和Component
)。
-
外观模式(Facade)
- 特点:为复杂系统提供简化接口,隐藏内部细节。
- 应用:框架的入口类(如 Spring 的
ApplicationContext
)、支付系统统一接口。
三、行为型模式(Behavioral Patterns)
关注对象间的通信和职责分配。
-
观察者模式(Observer)
- 特点:对象间一对多依赖,当一个对象变化时,所有依赖者自动收到通知。
- 应用:事件监听(如 Swing 的
ActionListener
)、消息队列、Spring 的事件机制。
-
策略模式(Strategy)
- 特点:定义算法家族,使其可相互替换,客户端根据需求选择。
- 应用:排序算法(选择不同排序策略)、支付方式(微信/支付宝切换)。
-
模板方法模式(Template Method)
- 特点:父类定义算法骨架,子类实现具体步骤,固定流程但灵活扩展。
- 应用:Spring 的
JdbcTemplate
(固定 JDBC 流程,自定义 SQL 和结果映射)。
-
迭代器模式(Iterator)
- 特点:提供遍历集合元素的统一接口,无需暴露集合内部结构。
- 应用:Java 的
Iterator
接口(遍历List
、Set
等)。
-
责任链模式(Chain of Responsibility)
- 特点:将请求传递给多个处理器,直到有一个处理它。
- 应用:过滤器链(如 Servlet 的
FilterChain
)、异常处理链、权限校验流程。
-
命令模式(Command)
- 特点:将请求封装为对象,使请求的发送者与接收者解耦。
- 应用:撤销/重做操作、任务调度(如 Quartz 的 Job)、GUI 按钮事件。
设计模式核心原则
- 开闭原则:对扩展开放,对修改关闭(如工厂方法、装饰器)。
- 单一职责:一个类只做一件事。
- 依赖倒置:依赖抽象,不依赖具体实现(如策略模式)。
- 迪米特法则:最少知道原则,减少对象间耦合(如外观模式)。
实际开发中,需根据场景选择合适模式,避免过度设计。很多框架(如 Spring、MyBatis)大量使用了上述模式,理解它们有助于更好地阅读和设计代码。