设计模式的分类及作用

设计模式(Design Patterns)是软件开发中一种经过验证的、可重用的解决方案,用来解决在特定场景下的常见问题。设计模式可以帮助程序员在面对复杂问题时,通过已经被验证过的方式来设计系统,使得代码更加清晰、可维护、可扩展。

设计模式一般分为三大类:创建型结构型行为型,每一类包含不同的模式。


一、创建型设计模式

这些模式主要关注对象的创建,旨在控制对象的实例化过程,以提高代码的灵活性和可维护性。

  1. 单例模式(Singleton Pattern)

    • 作用:确保一个类只有一个实例,并提供一个全局访问点。常用于需要共享全局状态或资源的情况,例如数据库连接池、日志对象等。
    • 使用场景:需要控制类的实例化次数,确保只存在一个实例。
  2. 工厂方法模式

    • 作用:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法将实例化工作推迟到子类中进行。
    • 使用场景:客户端不需要知道具体的类如何创建,只关心产品的接口。
  3. 抽象工厂模式

    • 作用:提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。通常与工厂方法一起使用。
    • 使用场景:当系统需要独立于产品的创建、组合和表示时,且涉及多个产品族时。
  4. 建造者模式

    • 作用:将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。适用于构建步骤复杂的对象,如多部件的构造。
    • 使用场景:需要构建一个复杂对象,并且希望分步骤灵活地组合这些部分。
  5. 原型模式

    • 作用:通过复制现有的对象来创建新的对象,而不是通过构造函数进行实例化。适合需要大量相似对象的场景,且对象创建代价较高时。
    • 使用场景:需要创建多个相似对象,且对象的构建过程较为复杂或昂贵。

二、结构型设计模式

这些模式关注如何通过组合对象来更好地组织类和对象的结构,使得结构更加灵活、可扩展。

  1. 适配器模式

    • 作用:将一个类的接口转换成客户端期望的接口,使得原本由于接口不兼容而无法一起工作的类可以协同工作。
    • 使用场景:当你需要使用一个现有的类,但它的接口与我们需求不兼容时。
  2. 桥接模式

    • 作用:将抽象部分与实现部分分离,使得两者可以独立变化。桥接模式通过引入桥接对象(通常是接口)来实现抽象与实现的解耦。
    • 使用场景:需要在多个维度上扩展类的功能时,可以避免类爆炸。
  3. 组合模式

    • 作用:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式允许客户端统一对待单个对象和组合对象。
    • 使用场景:处理具有递归结构的数据,如树形菜单、文件系统等。
  4. 装饰器模式

    • 作用:动态地给一个对象添加额外的功能,而不影响其他对象的功能。通过组合而非继承来增加对象的功能。
    • 使用场景:当需要扩展对象功能,而又不希望使用子类化的方式时。
  5. 外观模式

    • 作用:为复杂的子系统提供一个简单的接口,简化客户端与复杂系统的交互。它隐藏了系统的复杂性。
    • 使用场景:当系统非常复杂,需要为客户端提供简化的接口时。
  6. 享元模式

    • 作用:通过共享对象来减少内存的使用,尤其适用于需要大量对象但对象之间共享相同数据的场景。
    • 使用场景:大量细粒度对象的创建和维护,且这些对象的状态可以被共享时。
  7. 代理模式

    • 作用:为其他对象提供一种代理以控制对该对象的访问。常用于延迟加载、权限控制等场景。
    • 使用场景:当需要控制对某个对象的访问,或者当访问过程需要优化时。

三、行为型设计模式

这些模式关注对象之间的交互和职责分配,旨在通过不同对象之间的协作来实现复杂行为。

  1. 责任链模式

    • 作用:将请求沿着处理链传递,直到有一个对象处理它。它将请求的发送者和接收者解耦,使多个对象有机会处理请求。
    • 使用场景:需要在多个对象之间传递请求时,且不需要知道具体是哪个对象处理请求。
  2. 命令模式

    • 作用:将请求封装成一个对象,从而使你可以使用不同的请求、队列或者日志请求,并支持撤销操作。通过将请求与执行解耦,客户端可以通过命令来控制执行过程。
    • 使用场景:需要对请求进行参数化、排队执行,或提供撤销功能时。
  3. 解释器模式

    • 作用:为语言的语法树提供解释功能。通常用于构建计算机语言的解释器、脚本语言等。
    • 使用场景:当需要解释或编译特定语言的文本时。
  4. 迭代器模式

    • 作用:提供一种方法,能够顺序访问集合对象中的元素,而又不暴露该集合对象的内部结构。
    • 使用场景:当需要遍历集合元素并访问集合中的元素时。
  5. 中介者模式

    • 作用:通过定义一个中介者对象来简化多个对象之间的交互,避免对象之间的直接联系,从而减少系统的复杂度。
    • 使用场景:多个对象之间复杂的交互关系需要集中管理时。
  6. 备忘录模式

    • 作用:在不暴露对象实现细节的情况下,捕获对象的内部状态,以便稍后恢复该状态。
    • 使用场景:需要在某些时刻保存对象状态并能够恢复时。
  7. 观察者模式

    • 作用:定义了一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。
    • 使用场景:当一个对象的状态改变需要通知其他多个对象时。
  8. 状态模式

    • 作用:允许对象在其内部状态改变时改变其行为。对象看起来像是修改了它的类。
    • 使用场景:当对象的行为取决于它的状态,并且它必须根据状态来改变其行为时。
  9. 策略模式

    • 作用:定义一系列的算法,将每一个算法封装起来,并使它们可以相互替换。使得算法可以独立于使用它的客户而变化。
    • 使用场景:当有多种算法或行为,并且希望可以在运行时进行切换时。
  10. 模板方法模式

    • 作用:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中。模板方法模式可以让子类在不改变算法结构的情况下重新定义算法的某些特定步骤。
    • 使用场景:当算法的框架固定,但某些步骤可以由子类来实现时。
  11. 访问者模式

    • 作用:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变元素类的情况下,定义作用于这些元素的新操作。
    • 使用场景:当你需要对不同的对象进行不同的操作,并且希望避免改变这些对象的类时。
相关推荐
李少兄28 分钟前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝33 分钟前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖1 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601011 小时前
rust 同时处理多个异步任务
java·数据库·rust
9号达人1 小时前
java9新特性详解与实践
java·后端·面试
cg50171 小时前
Spring Boot 的配置文件
java·linux·spring boot
啊喜拔牙1 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
anlogic2 小时前
Java基础 4.3
java·开发语言
非ban必选2 小时前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
A旧城以西2 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea