GoF23种设计模式 简介

GoF23种设计模式

GoF23种设计模式(GoF指Gang of Four,四人组,《Design Patterns: Elements of Reusable Object-Oriented Software》的四位作者),按照核心功能和应用场景可分为三大类:创建型模式、结构型模式和行为型模式。

一、创建型模式

核心意图:封装对象创建过程,解耦"创建"与"使用",提高代码灵活性。

模式名称 核心功能 典型应用场景
简单工厂模式 (Simple Factory) 一个 工厂类根据参数 创建不同产品(非GoF标准) 工具类创建
1.工厂方法模式(Factory Method) 抽象工厂接口,子类决定实例化哪个产品 日志框架、数据库驱动
2.抽象工厂模式(Abstract Factory)) 创建一系列相关/依赖的产品族 跨平台UI库、Spring的BeanFactory
3.建造者模式(Builder) 分步构建复杂对象、分离构建与表示 复杂对象创建(如StringBuilder)
4.原型模式(Prototype) 通过复制现有实例创建新对象(避免重复初始化) 大对象复用(如缓存对象克隆
5.单例模式(Singleton) 确保一个类只有一个实例,提供全局访问点 配置管理器、线程池、数据库连接池
二、结构型模式

核心意图:处理类\对象的组合关系,优化代码结构,提高扩展性和复用性。

模式名称 核心功能 典型应用场景
6.适配器模式(Adapter) 转换一个类的接口为客户端期望的接口(兼容旧系统) 第三方库适配 、接口版本兼容(如Java的InputStreamReader)
7.桥接模式 (bridge) 分离抽象与实现,使二者可独立扩展 多维度产品扩展(如手机品牌+操作系统)
8.组合模式(Composite) 树形结构中统一处理单个对象和组合对象 文件夹/文件结构、UI组件树(如Swing组件)
9.装饰器模式(decorator) 动态给对象添加额外功能(不改变原类结构) IO流包装(如BufferReader)、Spring AOP增强
10.外观模式(Facade) 为复杂子系统提供统一的简化接口 框架入口(如Spring的ApplicationContest),API网关
11.享元模式(Flyweight) 共享细粒度对象、减少内存消耗 常量池(String常量池)、缓存池(如数据库连接池)
12.代理模式 (Proxy) 为对象提供代理,控制访问(如权限、缓存) 远程代理(RPC),Spring AOP代理、缓存代理
三、行为型模式

核心意图:描述类或对象之间的交互行为(通信、职责分配),优化代码协作逻辑 。

模式名称 核心功能 典型应用场景
13.责任链模式(Chain of Responsibility) 多个对象链式处理请求,直到有对象处理 请求审批流程、日志级别处理
14.命令模式(Conmmand) 将请求封装为对象,支持参数化,队列化执行 命令队列、撤销/重做功能
15.解释器模式(Interpreter) 定义语言语法规则,解析特定格式的表达式 表达式解析
16.迭代器模式(Iterator) 提供统一 遍历集合的接口,隐藏集合内部结构 Java集合的Iterator接口,foreach循环
17.中介者模式(Mediator) 封装对象间的复杂交互,通过中介者统一协调 聊天室、GUI组件通信
18.备忘录模式(Memento) 保存对象状态,以便后续恢复(不暴露内部结构) 撤销功能(如文本编辑器的 历史记录)、序列化备份
19.观察者模式(Observer) 一对多依赖,一个对象变化时通知所有依赖对象 事件监听,消息订阅
20.状态模式(State) 对象状态变化时,动态改变其行为(状态封装) 订单状态流转、线程状态管理
21.策略模式(Strategy) 定义多个算法,动态选择使用(替换if/else) 排序算法选择,支付方式切换,日志输出策略
22.模板方法模式(Template Method) 父类定义算法骨架,子类实现具体步骤 框架模板、回调函数
23.访问者模式(Visitor) 分离对象数据结构与操作,动态扩展新操作 数据结构遍历+多操作(如XML/JSON解析,报表生成)
  • 高频使用模式

    • 创建型:单例、工厂方法 、抽象工厂、建造者

    • 结构型:适配器、装饰器、代理、外观

    • 行为型:观察者、策略、模板方法、责任链

  • 场景选择举例

    • 需灵活创建对象:工厂方法、抽象工厂

    • 需扩展对象功能:装饰器/代理/适配器

    • 需优化对象交互:观察者/中介者/责任链

    • 需简化 复杂逻辑:策略(替换if/else),外观(封装子系统)

相关推荐
Javatutouhouduan13 小时前
Java面试常问Redis核心知识点整理!
java·数据库·redis·java面试·后端开发·java架构师·java程序员
AAA简单玩转程序设计13 小时前
谁说Java枚举只是“常量装盒”?它藏着这些骚操作
java·前端
枯基Evan13 小时前
applicationTaskExecutor Spring 内置线程池失效
java·数据库·spring
优爱蛋白13 小时前
IL-21:后Th1/Th2时代的免疫新星
java·服务器·前端·人工智能·健康医疗
Dolphin_Home13 小时前
【实用工具类】NullSafeUtils:一站式解决Java空值安全与通用操作(附完整源码)
java·网络·spring boot·后端·spring
高山上有一只小老虎13 小时前
判断是否为数独数组
java·算法
okseekw13 小时前
File类:你与文件的"爱恨情仇"——Java文件操作的趣味指南
java·后端
梨落秋霜13 小时前
Python入门篇【if判断语句】
android·java·python
萝卜白菜。13 小时前
关于maxPartCount和maxPartHeaderSize参数的限制说明
java·tomcat