23种经典设计模式

设计模式的六大原则(SOLID原则)

大多数设计模式都遵循着面向对象设计的核心原则,最著名的就是 SOLID 原则:

  • S - 单一职责原则:一个类应该只有一个引起变化的原因。即一个类只负责一项职责。

  • O - 开闭原则 :软件实体(类、模块、函数)应该对扩展开放 ,对修改关闭。即在不修改现有代码的情况下,通过扩展来增加新功能。

  • L - 里氏替换原则:子类必须能够替换掉它们的父类,而不破坏程序的正确性。这是继承复用的基石。

  • I - 接口隔离原则:不应该强迫客户依赖于它们不用的方法。使用多个专门的接口,比使用一个庞大臃肿的总接口要好。

  • D - 依赖倒置原则

    • 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。

    • 抽象不应该依赖于细节,细节应该依赖于抽象。

    • 提倡面向接口编程,而不是面向实现编程。

以下是完整的23种经典设计模式,按照创建型、结构型和行为型三大类别进行分类和介绍。

一、 创建型模式 (5种)

关注对象的创建机制,降低对象创建的复杂度

1. 单例模式 (Singleton)

  • 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点

  • 场景:数据库连接池、日志记录器、应用配置、线程池

  • 关键点:私有构造函数、静态实例、静态访问方法

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

  • 意图:定义一个创建对象的接口,但让子类决定实例化哪一个类

  • 场景:日志记录器(文件日志、数据库日志)、连接不同的数据库

  • 关键点:将对象创建延迟到子类

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

  • 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

  • 场景:GUI工具包(创建一套风格一致的界面元素)、跨平台应用

  • 关键点:创建产品家族

4. 建造者模式 (Builder)

  • 意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

  • 场景 :创建复杂套餐、StringBuilder、查询条件构建

  • 关键点:分步构建、导向器指导构建过程

5. 原型模式 (Prototype)

  • 意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

  • 场景:对象创建成本高时、需要保存对象状态时

  • 关键点 :实现Cloneable接口,深拷贝与浅拷贝


二、 结构型模式 (7种)

关注类和对象的组合,形成更大的结构

6. 适配器模式 (Adapter)

  • 意图:将一个类的接口转换成客户希望的另外一个接口

  • 场景:使用遗留代码、接口不兼容的类协作

  • 关键点:类适配器(继承)和对象适配器(组合)

7. 桥接模式 (Bridge)

  • 意图:将抽象部分与它的实现部分分离,使它们都可以独立地变化

  • 场景:不同平台上的不同图像格式绘制、消息发送(邮件、短信)

  • 关键点:组合代替继承,两个维度独立变化

8. 组合模式 (Composite)

  • 意图:将对象组合成树形结构以表示"部分-整体"的层次结构

  • 场景:文件系统、组织架构、菜单系统

  • 关键点:统一对待单个对象和组合对象

9. 装饰器模式 (Decorator)

  • 意图:动态地给一个对象添加一些额外的职责

  • 场景:Java I/O流、为组件添加边框等增强功能

  • 关键点:透明地扩展功能,避免子类爆炸

10. 外观模式 (Facade)

  • 意图:为子系统中的一组接口提供一个一致的界面

  • 场景:简化复杂系统调用、API网关

  • 关键点:提供统一的高层接口

11. 享元模式 (Flyweight)

  • 意图:运用共享技术有效地支持大量细粒度的对象

  • 场景:文字编辑器中的字符对象、游戏中的粒子系统

  • 关键点:共享内部状态,外部状态由客户端维护

12. 代理模式 (Proxy)

  • 意图:为其他对象提供一种代理以控制对这个对象的访问

  • 场景

    • 远程代理:RPC调用

    • 虚拟代理:图片延迟加载

    • 保护代理:权限控制

  • 关键点:控制对象访问,增强功能


三、 行为型模式 (11种)

关注对象之间的职责分配和算法

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

  • 意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系

  • 场景:审批流程、异常处理、过滤器链

  • 关键点:请求沿着链传递,直到有对象处理它

14. 命令模式 (Command)

  • 意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化

  • 场景:GUI按钮操作、事务管理、任务队列、撤销操作

  • 关键点:将请求封装为对象,支持撤销和日志

15. 解释器模式 (Interpreter)

  • 意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器

  • 场景:正则表达式、SQL解析、数学公式计算

  • 关键点:定义文法规则,构建抽象语法树

16. 迭代器模式 (Iterator)

  • 意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示

  • 场景:Java集合框架的Iterator、自定义集合遍历

  • 关键点:分离集合对象的遍历行为

17. 中介者模式 (Mediator)

  • 意图:用一个中介对象来封装一系列的对象交互

  • 场景:GUI组件间的通信、聊天室、飞机调度系统

  • 关键点:将网状结构变为星形结构,降低耦合

18. 备忘录模式 (Memento)

  • 意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态

  • 场景:文本编辑器的撤销操作、游戏存档

  • 关键点:状态保存和恢复,不破坏封装性

19. 观察者模式 (Observer)

  • 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

  • 场景:事件处理系统、消息订阅、MVC模式

  • 关键点:主题和观察者,松耦合通信

20. 状态模式 (State)

  • 意图:允许一个对象在其内部状态改变时改变它的行为

  • 场景:电梯状态、订单状态、TCP连接状态

  • 关键点:将状态封装成独立的类,状态转换

21. 策略模式 (Strategy)

  • 意图:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换

  • 场景:支付方式、排序算法、出行方式

  • 关键点:算法族,可以互相替换

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

  • 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中

  • 场景InputStream的read方法、制作饮料流程

  • 关键点:固定算法骨架,子类重定义特定步骤

23. 访问者模式 (Visitor)

  • 意图:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作

  • 场景:编译器语法树操作、文档处理

  • 关键点:双重分发,易于添加新操作但难以添加新元素


总结表格

类别 模式名称 核心目的
创建型 单例、工厂方法、抽象工厂、建造者、原型 对象创建
结构型 适配器、桥接、组合、装饰器、外观、享元、代理 类与对象组合
行为型 责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者 对象交互和职责分配
相关推荐
Zane19942 小时前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫1 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19941 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19942 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..2 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1503 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)3 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki4 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅664 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa4 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio