24 种 Java 设计模式的完整分类及说明

      以下是24 种 Java 设计模式的完整分类及说明(按创建型、结构型、行为型三大类划分):

一、创建型模式(6 种):负责对象的创建,隐藏创建细节

创建型模式关注如何灵活、安全地创建对象,避免直接使用 new关键字,提高代码的可维护性和扩展性。

  1. 简单工厂模式(Simple Factory)

    • 核心:通过一个静态工厂类,根据参数返回不同产品的实例(如 Integer.valueOf())。

    • 应用场景:产品种类少且稳定(如日志工具、配置管理器)。

    • 特点:集中管理创建逻辑,但新增产品需修改工厂类(违反开闭原则)。

  2. 工厂方法模式(Factory Method)

    • 核心:定义创建对象的接口,由子类决定实例化哪个类(如 JDBCDriverManager.getConnection())。

    • 应用场景:需要灵活扩展产品类型(如数据库驱动、日志框架)。

    • 特点:符合开闭原则,新增产品只需添加工厂子类。

  3. 抽象工厂模式(Abstract Factory)

    • 核心:提供一个接口,用于创建一系列相关或依赖对象的家族(如 SwingLookAndFeel工厂)。

    • 应用场景:需要创建产品族(如不同操作系统的 UI 组件:Windows/Mac 按钮+文本框)。

    • 特点:确保产品族的一致性,但扩展新产品族需修改抽象工厂接口(违反开闭原则)。

  4. 单例模式(Singleton)

    • 核心:确保一个类仅有一个实例,并提供全局唯一访问点(如 SpringBeanFactory、配置管理器)。

    • 应用场景:需要全局唯一实例的对象(如数据库连接池、缓存)。

    • 特点:线程安全(双重检查锁定、静态内部类)、延迟初始化。

  5. 建造者模式(Builder)

    • 核心:将复杂对象的构建与表示分离,通过指挥者(Director)控制构建过程(如 StringBuilderHttpRequest.builder())。

    • 应用场景:构建参数众多的对象(如 HTTP 请求、配置文件)。

    • 特点:支持链式调用,隐藏构建细节。

  6. 原型模式(Prototype)

    • 核心:通过复制现有对象(原型)创建新对象(如 Javaclone()方法、BeanUtils.copyProperties())。

    • 应用场景:对象创建成本高(如数据库查询结果、配置对象)或需要大量相似对象(如游戏中的精灵)。

    • 特点:避免重复初始化,分为浅拷贝(复制引用)和深拷贝(复制对象本身)。

二、结构型模式(7 种):负责类或对象的组合,形成更大的结构

结构型模式关注如何将类或对象组合成更灵活的结构,解决类之间的耦合问题。

  1. 适配器模式(Adapter)

    • 核心:将一个类的接口转换成客户端期望的另一个接口(如 JavaInputStreamReader(字节流→字符流)、第三方库适配)。

    • 应用场景:集成第三方库(如 Redis客户端的 JedisAdapter)、兼容旧系统。

    • 特点:对象适配器(组合,推荐) vs 类适配器(继承,不推荐)。

  2. 桥接模式(Bridge)

    • 核心:将抽象部分与实现部分分离,使它们可独立变化(如 JavaAWT(抽象窗口工具包)、JDBC驱动)。

    • 应用场景:多维度变化(如不同形状的按钮、不同数据库的连接)。

    • 特点:避免子类爆炸(如 WindowsButtonMacButtonLinuxButton),提高扩展性。

  3. 组合模式(Composite)

    • 核心:将对象组合成树形结构,以表示“部分-整体”层次(如 JavaFile类、UI控件树)。

    • 应用场景:树形结构(如文件系统、菜单、组织架构)。

    • 特点:统一接口(Component),支持递归遍历(如 File.listFiles())。

  4. 装饰器模式(Decorator)

    • 核心:动态地给对象添加职责,而不影响其他对象(如 JavaIO流(BufferedInputStreamDataInputStream)、Spring@Transactional)。

    • 应用场景:功能扩展(如给咖啡加牛奶、糖;给方法加日志、事务)。

    • 特点:比继承更灵活,支持叠加装饰(如 BufferedInputStream(FileInputStream))。

  5. 外观模式(Facade)

    • 核心:为子系统提供统一的高层接口,简化客户端使用(如 JavaJDBCDriverManager.getConnection())、SpringApplicationContext)。

    • 应用场景:复杂库的简化(如 HibernateSession、微服务网关)。

    • 特点:不封装子系统,仅提供便捷入口。

  6. 享元模式(Flyweight)

    • 核心:通过共享技术有效支持大量细粒度对象(如 JavaString常量池、Integer缓存(-128~127))。

    • 应用场景:对象创建代价高(如文本编辑器中的字符、游戏中的子弹/粒子)。

    • 特点:分离内在状态(可共享,如字符编码)和外在状态(不可共享,如字符位置)。

  7. 代理模式(Proxy)

    • 核心:为其他对象提供代理,以控制对该对象的访问(如 Java的动态代理(JDKCGLIB)、SpringAOP)。

    • 应用场景:远程代理(RPC调用)、虚拟代理(延迟加载,如图片缩略图)、保护代理(权限控制)、智能引用(引用计数、日志)。

    • 特点:静态代理(需实现相同接口) vs 动态代理(无需实现接口,更灵活)。

三、行为型模式(11 种):负责对象之间的交互及算法分配

行为型模式关注对象之间的通讯和职责分配,解决对象之间的耦合问题。

  1. 责任链模式(Chain of Responsibility)

    • 核心:使多个对象有机会处理请求,避免请求发送者与接收者耦合(如 JavaServlet过滤器、SpringInterceptor、审批流程)。

    • 应用场景:请求处理链(如日志过滤、权限校验、工作流)。

    • 特点:每个处理器持有下一个处理器的引用,支持动态调整处理顺序。

  2. 命令模式(Command)

    • 核心:将请求封装为对象,使你可以参数化客户、队列请求、记录日志、支持撤销(如 JavaRunnableSpringJdbcTemplate)。

    • 应用场景:命令队列(如任务调度)、撤销/重做(如文本编辑器)、远程调用(如 RPC)。

    • 特点:分离调用者(Invoker)与执行者(Receiver),支持命令的持久化和回滚。

  3. 解释器模式(Interpreter)

    • 核心:定义语言文法,并解释该语言中的句子(如 Java的正则表达式引擎、SQL解析器、规则引擎)。

    • 应用场景:需要解释特定语言的场景(如数学表达式、配置文件)。

    • 特点:文法规则(终结符/非终结符表达式)、上下文(存储解释状态)。

  4. 迭代器模式(Iterator)

    • 核心:提供一种方法顺序访问聚合对象的元素,而不暴露其内部表示(如 JavaIterableIteratorList/Set的遍历)。

    • 应用场景:需要遍历集合对象的场景(如 ArrayListHashSetTreeMap)。

    • 特点:支持多种遍历方式(正向、反向、层级),隐藏集合的内部结构。

  5. 中介者模式(Mediator)

    • 核心:用一个中介对象封装一系列对象交互,降低耦合(如 JavaChatRoomGUI组件协调、航空管制)。

    • 应用场景:对象之间需要频繁交互(如聊天室、多人游戏、工作流引擎)。

    • 特点:中介者持有所有对象的引用,统一处理交互逻辑。

  6. 备忘录模式(Memento)

    • 核心:在不破坏封装性的前提下捕获并外部化对象内部状态,以便恢复(如 JavaThreadLocalSpringTransactionSynchronization)。

    • 应用场景:撤销操作(Ctrl+Z)、游戏存档、事务回滚。

    • 特点:备忘录(Memento)存储对象状态,管理者(Caretaker)保管备忘录,原对象(Originator)恢复状态。

  7. 观察者模式(Observer)

    • 核心:定义对象间一对多的依赖,当对象改变状态时,所有依赖者自动更新(如 JavaObservable/ObserverSpringApplicationEvent、事件总线)。

    • 应用场景:事件驱动(如按钮点击、消息订阅)、发布-订阅(Pub/Sub)。

    • 特点:主题(Subject)维护观察者列表,观察者(Observer)实现更新方法。

  8. 状态模式(State)

    • 核心:允许对象在其内部状态改变时改变其行为(如 JavaThread状态(新建、运行、阻塞)、TCP连接状态(建立、传输、关闭))。

    • 应用场景:对象状态变化影响行为(如订单状态(待支付、已支付、已发货)、游戏角色状态(正常、眩晕、死亡))。

    • 特点:状态接口(State)定义行为,上下文(Context)委托给当前状态。

  9. 策略模式(Strategy)

    • 核心:定义一系列算法,把它们封装起来,并使它们可互相替换(如 JavaComparatorSpringResource、支付方式(支付宝、微信、银行卡))。

    • 应用场景:算法切换(如排序算法(冒泡、快速、归并)、折扣策略(8折、满减、优惠券))。

    • 特点:策略接口(Strategy)定义算法,上下文(Context)持有策略引用。

  10. 模板方法模式(Template Method)

    • 核心:定义算法骨架,将一些步骤延迟到子类(如 JavaHttpServletdoGet()/doPost())、JUnit测试生命周期(setUp()/tearDown()))。

    • 应用场景:算法步骤固定,部分步骤可自定义(如文档生成、数据处理流程)。

    • 特点:模板方法(templateMethod())定义骨架,钩子方法(primitiveOperation())允许子类扩展。

  11. 访问者模式(Visitor)

    • 核心:表示一个作用于某对象结构中各元素的操作,可在不改变元素类的前提下定义新操作(如 JavaAST(抽象语法树)遍历、报表生成)。

    • 应用场景:需要添加新操作但不想修改元素类(如编译器的语法分析、数据结构的遍历)。

    • 特点:元素(Element)接受访问者(Visitor),访问者实现操作方法。

四、补充说明:24 种设计模式的来源

  • GoF 23 种:由 Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides 四位作者在《设计模式:可复用面向对象软件的基础》(1994 年)一书中提出,是设计模式的经典集合。

  • 第 24 种(简单工厂模式):部分资料将其补充为第 24 种,因它是工厂方法模式的简化版,更常用(如 Integer.valueOf()LoggerFactory.getLogger())。

五、设计模式的最佳实践

  1. 遵循 SOLID 原则:尤其是开闭原则(对扩展开放,对修改关闭)、单一职责原则(一个类只负责一项职责)。

  2. 避免过度设计:不要为了使用设计模式而使用,需根据实际场景选择(如简单场景无需用抽象工厂模式)。

  3. 结合框架使用SpringMyBatis等框架已大量使用设计模式(如 SpringIOC(工厂模式)、AOP(代理模式)、MVC(模板方法模式)),学习框架源码可加深对设计模式的理解。

通过以上 24 种设计模式的分类及说明,可覆盖 Java 开发中大部分常见场景,提高代码的可维护性、可扩展性和可读性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值