以下是24 种 Java 设计模式的完整分类及说明(按创建型、结构型、行为型三大类划分):
一、创建型模式(6 种):负责对象的创建,隐藏创建细节
创建型模式关注如何灵活、安全地创建对象,避免直接使用 new关键字,提高代码的可维护性和扩展性。
-
简单工厂模式(Simple Factory)
-
核心:通过一个静态工厂类,根据参数返回不同产品的实例(如
Integer.valueOf())。 -
应用场景:产品种类少且稳定(如日志工具、配置管理器)。
-
特点:集中管理创建逻辑,但新增产品需修改工厂类(违反开闭原则)。
-
-
工厂方法模式(Factory Method)
-
核心:定义创建对象的接口,由子类决定实例化哪个类(如
JDBC的DriverManager.getConnection())。 -
应用场景:需要灵活扩展产品类型(如数据库驱动、日志框架)。
-
特点:符合开闭原则,新增产品只需添加工厂子类。
-
-
抽象工厂模式(Abstract Factory)
-
核心:提供一个接口,用于创建一系列相关或依赖对象的家族(如
Swing的LookAndFeel工厂)。 -
应用场景:需要创建产品族(如不同操作系统的 UI 组件:Windows/Mac 按钮+文本框)。
-
特点:确保产品族的一致性,但扩展新产品族需修改抽象工厂接口(违反开闭原则)。
-
-
单例模式(Singleton)
-
核心:确保一个类仅有一个实例,并提供全局唯一访问点(如
Spring的BeanFactory、配置管理器)。 -
应用场景:需要全局唯一实例的对象(如数据库连接池、缓存)。
-
特点:线程安全(双重检查锁定、静态内部类)、延迟初始化。
-
-
建造者模式(Builder)
-
核心:将复杂对象的构建与表示分离,通过指挥者(
Director)控制构建过程(如StringBuilder、HttpRequest.builder())。 -
应用场景:构建参数众多的对象(如 HTTP 请求、配置文件)。
-
特点:支持链式调用,隐藏构建细节。
-
-
原型模式(Prototype)
-
核心:通过复制现有对象(原型)创建新对象(如
Java的clone()方法、BeanUtils.copyProperties())。 -
应用场景:对象创建成本高(如数据库查询结果、配置对象)或需要大量相似对象(如游戏中的精灵)。
-
特点:避免重复初始化,分为浅拷贝(复制引用)和深拷贝(复制对象本身)。
-
二、结构型模式(7 种):负责类或对象的组合,形成更大的结构
结构型模式关注如何将类或对象组合成更灵活的结构,解决类之间的耦合问题。
-
适配器模式(Adapter)
-
核心:将一个类的接口转换成客户端期望的另一个接口(如
Java的InputStreamReader(字节流→字符流)、第三方库适配)。 -
应用场景:集成第三方库(如
Redis客户端的JedisAdapter)、兼容旧系统。 -
特点:对象适配器(组合,推荐) vs 类适配器(继承,不推荐)。
-
-
桥接模式(Bridge)
-
核心:将抽象部分与实现部分分离,使它们可独立变化(如
Java的AWT(抽象窗口工具包)、JDBC驱动)。 -
应用场景:多维度变化(如不同形状的按钮、不同数据库的连接)。
-
特点:避免子类爆炸(如
WindowsButton、MacButton、LinuxButton),提高扩展性。
-
-
组合模式(Composite)
-
核心:将对象组合成树形结构,以表示“部分-整体”层次(如
Java的File类、UI控件树)。 -
应用场景:树形结构(如文件系统、菜单、组织架构)。
-
特点:统一接口(
Component),支持递归遍历(如File.listFiles())。
-
-
装饰器模式(Decorator)
-
核心:动态地给对象添加职责,而不影响其他对象(如
Java的IO流(BufferedInputStream、DataInputStream)、Spring的@Transactional)。 -
应用场景:功能扩展(如给咖啡加牛奶、糖;给方法加日志、事务)。
-
特点:比继承更灵活,支持叠加装饰(如
BufferedInputStream(FileInputStream))。
-
-
外观模式(Facade)
-
核心:为子系统提供统一的高层接口,简化客户端使用(如
Java的JDBC(DriverManager.getConnection())、Spring的ApplicationContext)。 -
应用场景:复杂库的简化(如
Hibernate的Session、微服务网关)。 -
特点:不封装子系统,仅提供便捷入口。
-
-
享元模式(Flyweight)
-
核心:通过共享技术有效支持大量细粒度对象(如
Java的String常量池、Integer缓存(-128~127))。 -
应用场景:对象创建代价高(如文本编辑器中的字符、游戏中的子弹/粒子)。
-
特点:分离内在状态(可共享,如字符编码)和外在状态(不可共享,如字符位置)。
-
-
代理模式(Proxy)
-
核心:为其他对象提供代理,以控制对该对象的访问(如
Java的动态代理(JDK、CGLIB)、Spring的AOP)。 -
应用场景:远程代理(
RPC调用)、虚拟代理(延迟加载,如图片缩略图)、保护代理(权限控制)、智能引用(引用计数、日志)。 -
特点:静态代理(需实现相同接口) vs 动态代理(无需实现接口,更灵活)。
-
三、行为型模式(11 种):负责对象之间的交互及算法分配
行为型模式关注对象之间的通讯和职责分配,解决对象之间的耦合问题。
-
责任链模式(Chain of Responsibility)
-
核心:使多个对象有机会处理请求,避免请求发送者与接收者耦合(如
Java的Servlet过滤器、Spring的Interceptor、审批流程)。 -
应用场景:请求处理链(如日志过滤、权限校验、工作流)。
-
特点:每个处理器持有下一个处理器的引用,支持动态调整处理顺序。
-
-
命令模式(Command)
-
核心:将请求封装为对象,使你可以参数化客户、队列请求、记录日志、支持撤销(如
Java的Runnable、Spring的JdbcTemplate)。 -
应用场景:命令队列(如任务调度)、撤销/重做(如文本编辑器)、远程调用(如
RPC)。 -
特点:分离调用者(
Invoker)与执行者(Receiver),支持命令的持久化和回滚。
-
-
解释器模式(Interpreter)
-
核心:定义语言文法,并解释该语言中的句子(如
Java的正则表达式引擎、SQL解析器、规则引擎)。 -
应用场景:需要解释特定语言的场景(如数学表达式、配置文件)。
-
特点:文法规则(终结符/非终结符表达式)、上下文(存储解释状态)。
-
-
迭代器模式(Iterator)
-
核心:提供一种方法顺序访问聚合对象的元素,而不暴露其内部表示(如
Java的Iterable、Iterator、List/Set的遍历)。 -
应用场景:需要遍历集合对象的场景(如
ArrayList、HashSet、TreeMap)。 -
特点:支持多种遍历方式(正向、反向、层级),隐藏集合的内部结构。
-
-
中介者模式(Mediator)
-
核心:用一个中介对象封装一系列对象交互,降低耦合(如
Java的ChatRoom、GUI组件协调、航空管制)。 -
应用场景:对象之间需要频繁交互(如聊天室、多人游戏、工作流引擎)。
-
特点:中介者持有所有对象的引用,统一处理交互逻辑。
-
-
备忘录模式(Memento)
-
核心:在不破坏封装性的前提下捕获并外部化对象内部状态,以便恢复(如
Java的ThreadLocal、Spring的TransactionSynchronization)。 -
应用场景:撤销操作(
Ctrl+Z)、游戏存档、事务回滚。 -
特点:备忘录(
Memento)存储对象状态,管理者(Caretaker)保管备忘录,原对象(Originator)恢复状态。
-
-
观察者模式(Observer)
-
核心:定义对象间一对多的依赖,当对象改变状态时,所有依赖者自动更新(如
Java的Observable/Observer、Spring的ApplicationEvent、事件总线)。 -
应用场景:事件驱动(如按钮点击、消息订阅)、发布-订阅(
Pub/Sub)。 -
特点:主题(
Subject)维护观察者列表,观察者(Observer)实现更新方法。
-
-
状态模式(State)
-
核心:允许对象在其内部状态改变时改变其行为(如
Java的Thread状态(新建、运行、阻塞)、TCP连接状态(建立、传输、关闭))。 -
应用场景:对象状态变化影响行为(如订单状态(待支付、已支付、已发货)、游戏角色状态(正常、眩晕、死亡))。
-
特点:状态接口(
State)定义行为,上下文(Context)委托给当前状态。
-
-
策略模式(Strategy)
-
核心:定义一系列算法,把它们封装起来,并使它们可互相替换(如
Java的Comparator、Spring的Resource、支付方式(支付宝、微信、银行卡))。 -
应用场景:算法切换(如排序算法(冒泡、快速、归并)、折扣策略(8折、满减、优惠券))。
-
特点:策略接口(
Strategy)定义算法,上下文(Context)持有策略引用。
-
-
模板方法模式(Template Method)
-
核心:定义算法骨架,将一些步骤延迟到子类(如
Java的HttpServlet(doGet()/doPost())、JUnit测试生命周期(setUp()/tearDown()))。 -
应用场景:算法步骤固定,部分步骤可自定义(如文档生成、数据处理流程)。
-
特点:模板方法(
templateMethod())定义骨架,钩子方法(primitiveOperation())允许子类扩展。
-
-
访问者模式(Visitor)
-
核心:表示一个作用于某对象结构中各元素的操作,可在不改变元素类的前提下定义新操作(如
Java的AST(抽象语法树)遍历、报表生成)。 -
应用场景:需要添加新操作但不想修改元素类(如编译器的语法分析、数据结构的遍历)。
-
特点:元素(
Element)接受访问者(Visitor),访问者实现操作方法。
-
四、补充说明:24 种设计模式的来源
-
GoF 23 种:由 Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides 四位作者在《设计模式:可复用面向对象软件的基础》(1994 年)一书中提出,是设计模式的经典集合。
-
第 24 种(简单工厂模式):部分资料将其补充为第 24 种,因它是工厂方法模式的简化版,更常用(如
Integer.valueOf()、LoggerFactory.getLogger())。
五、设计模式的最佳实践
-
遵循 SOLID 原则:尤其是开闭原则(对扩展开放,对修改关闭)、单一职责原则(一个类只负责一项职责)。
-
避免过度设计:不要为了使用设计模式而使用,需根据实际场景选择(如简单场景无需用抽象工厂模式)。
-
结合框架使用:
Spring、MyBatis等框架已大量使用设计模式(如Spring的IOC(工厂模式)、AOP(代理模式)、MVC(模板方法模式)),学习框架源码可加深对设计模式的理解。
通过以上 24 种设计模式的分类及说明,可覆盖 Java 开发中大部分常见场景,提高代码的可维护性、可扩展性和可读性。
2026

被折叠的 条评论
为什么被折叠?



