简单讲一下有哪些常见的设计模式?

简介: 我是小假 期待与你的下一次相遇 ~


设计模式是软件设计中常见问题的典型、可复用的解决方案。它们就像是编程中的“棋谱”或“菜谱”,能帮助我们写出更灵活、可维护和可扩展的代码。

这里简单介绍一些最常见和核心的设计模式,主要来自经典的“GoF”(四人帮)23种模式,可以分为三大类:

1. 创建型模式

关注点: 如何创建对象,将对象的创建与使用分离。

  1. 单例模式
  • 核心思想: 保证一个类只有一个实例,并提供一个全局访问点。
  • 简单理解: 就像一个国家只能有一个总统。你通过一个特定渠道(如宪法规定)去获取这个总统,而不能自己new一个出来。
  • 常见场景: 数据库连接池、日志记录器、应用配置、线程池。
  1. 工厂方法模式
  • 核心思想: 定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
  • 简单理解: 有一家“汽车公司”接口,它规定了一个“造车”的方法。它的子公司“宝马工厂”和“奥迪工厂”分别实现这个“造车”方法,来生产具体的“宝马”和“奥迪”汽车。
  • 常见场景: 日志记录器(可以输出到文件、控制台、数据库)、连接器(可以连接不同数据库)。
  1. 抽象工厂模式
  • 核心思想: 提供一个接口,用于创建相关或依赖对象家族,而不需要指定具体的类。
  • 简单理解: 比工厂方法更高级。比如有一个“家具工厂”接口,它能生产一整套家具(椅子、沙发、茶几)。然后有“现代风格工厂”和“古典风格工厂”来实现这个接口,分别生产一整套现代风格和古典风格的家具。
  • 常见场景: 跨平台UI组件库(一套Windows风格的按钮、文本框,一套Mac风格的按钮、文本框)。
  1. 建造者模式
  • 核心思想: 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
  • 简单理解: 就像组装电脑。导演(指导者)告诉建造者(如高配电脑建造者)按照一个固定的流程(装CPU、装内存、装硬盘)来建造,但建造者可以根据指令选择不同的部件(i9 CPU, 32G内存),最终组装出不同配置但流程相同的电脑。
  • 常见场景: 创建复杂的对象,这些对象有很多可选的部件或配置,例如SQL查询构建器、邮件对象、游戏中的角色。

2. 结构型模式

关注点: 如何将类或对象组合成更大的结构。

  1. 适配器模式
  • 核心思想: 将一个类的接口转换成客户期望的另一个接口。让原本接口不兼容的类可以一起工作。
  • 简单理解: 就像电源转接头。你的中国插头(客户端)不能直接插到欧洲插座(目标接口)上,一个转接头(适配器)在中间进行转换,让它们能一起工作。
  • 常见场景: 整合遗留系统、使用第三方库。
  1. 代理模式
  • 核心思想: 为其他对象提供一种代理以控制对这个对象的访问。
  • 简单理解: 就像明星的经纪人。你想找明星(真实对象)合作,必须先通过经纪人(代理)。经纪人可能会帮你安排时间、过滤不合理的请求,甚至直接拒绝你,而不用惊动明星本人。
  • 常见场景: 远程代理(远程调用)、虚拟代理(延迟加载大图片)、保护代理(权限控制)、日志记录代理。
  1. 装饰器模式
  • 核心思想: 动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。
  • 简单理解: 就像给游戏角色穿装备。一个基础角色(被装饰对象),你可以给他穿上“武器”(装饰器A),再穿上“盔甲”(装饰器B),再戴上“戒指”(装饰器C)。每件装备都为角色增加了新的能力,并且可以自由组合。
  • 常见场景: Java的I/O流(FileInputStreamBufferedInputStream 装饰,增加了缓冲功能)。
  1. 外观模式
  • 核心思想: 为子系统中的一组接口提供一个一致的界面。它定义了一个高层接口,使得这一子系统更加容易使用。
  • 简单理解: 就像医院的服务台。你看病需要去挂号、找科室、划价、取药等一系列复杂操作。服务台(外观)提供了一个“一站式”服务,你只需要告诉服务台你要干嘛,它来帮你协调内部所有部门。
  • 常见场景: 简化复杂库或遗留系统的调用。

3. 行为型模式

关注点: 对象之间的职责分配和通信。

  1. 观察者模式
  • 核心思想: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  • 简单理解: 就像微信公众号(主题)。你(观察者)关注了某个公众号。当公众号发布新文章(状态改变)时,所有关注者都会收到推送(被通知)。
  • 常见场景: 事件处理系统、MVC模式中的模型与视图关系、消息队列。
  1. 策略模式
  • 核心思想: 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。策略模式使得算法可以独立于使用它的客户而变化。
  • 简单理解: 就像出行的导航策略。你要去一个地方,可以选择“最快路线”、“最短路线”、“避开收费”等不同策略。你(上下文)不需要关心每种策略具体怎么算,只需要设置一个策略,然后执行它。
  • 常见场景: 支付方式(支付宝、微信、信用卡)、排序算法(快排、冒泡、归并)、数据验证规则。
  1. 模板方法模式
  • 核心思想: 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  • 简单理解: 就像泡茶和泡咖啡的流程。父类定义了一个“冲泡饮料”的模板方法:1. 烧水 -> 2. 加原料 -> 3. 冲泡 -> 4. 加调料。子类“泡茶”和“泡咖啡”只需要重写“加原料”(茶叶/咖啡粉)和“加调料”(柠檬/糖)这两个步骤,而不用改变整个流程。
  • 常见场景: 框架设计,Java中的 HttpServlet

总结

模式 分类 一句话核心
单例 创建型 保证一个类只有一个实例。
工厂方法 创建型 子类决定创建哪个对象。
抽象工厂 创建型 创建一整套相关的产品。
建造者 创建型 分步骤地构建复杂对象。
适配器 结构型 转换接口,使不兼容的类能协作。
代理 结构型 控制和管理对原始对象的访问。
装饰器 结构型 动态地给对象添加新功能。
外观 结构型 为复杂子系统提供一个简单接口。
观察者 行为型 状态改变时,自动通知所有依赖者。
策略 行为型 封装算法,使它们可以互换。
模板方法 行为型 定义算法骨架,子类重写特定步骤。

初学者可以先从单例、工厂方法、观察者、策略这几个最常用的模式入手,理解它们的意图和适用场景,然后在自己的项目中尝试应用。记住,不要为了用模式而用模式,模式是为了解决实际问题而存在的。

相关文章
|
1月前
|
人工智能 Java 关系型数据库
IT精选面试题系列之Java(面试准备篇)
消失一年回归!前凡人程序员化身面试导师,爆肝整理高频IT面试题。首期聚焦Java,涵盖技术储备、项目包装、简历优化与话术技巧,教你从0到1拿下Offer,干货拉满,速来取经!
105 2
|
存储 前端开发 Java
揭秘!如何用Spring Boot轻松打造动态二维码生成器?一键解锁无限可能,你的创意将无处不在!
【8月更文挑战第29天】在数字化时代,二维码成为信息快速传递的关键工具,广泛应用于支付、身份验证和产品追溯等场景。本文将指导你如何利用Spring Boot框架和Google的ZXing库,搭建一个动态生成二维码的Web服务。首先,通过Spring Initializr创建项目并配置相关依赖;接着,编写二维码生成逻辑和服务类;最后,在Controller中整合这些功能,提供RESTful接口供外部调用。通过访问`/generate-qrcode?text=你的内容`即可测试API并获取二维码图片。这为开发者提供了强大的工具,未来还可进一步优化存储和提升性能。
587 3
|
数据可视化 Java Nacos
OpenFeign + Sentinel 实现微服务熔断限流实战
本文介绍如何在Spring Cloud微服务架构中,结合OpenFeign与阿里巴巴开源组件Sentinel,实现服务调用的熔断、降级与限流。通过实战步骤搭建user-service与order-service,集成Nacos注册中心与Sentinel Dashboard,演示服务异常熔断、QPS限流控制,并支持自定义限流响应。借助Fallback降级机制与可视化规则配置,提升系统稳定性与高可用性,助力构建健壮的分布式应用。
455 155
|
1月前
|
缓存 前端开发 Java
深入理解 Java 类加载器:双亲委派机制的前世今生与源码解析
本文深入解析Java类加载器与双亲委派机制,从Bootstrap到自定义加载器,剖析loadClass源码,揭示类加载的线程安全、缓存机制与委派逻辑,并探讨SPI、Tomcat、OSGi等场景下打破双亲委派的原理与实践价值。(238字)
277 8
深入理解 Java 类加载器:双亲委派机制的前世今生与源码解析
|
Java API 安全
Java 8 十大新特性详解:Lambda、Stream、Optional 一网打尽
Java 8 十大新特性全面解析,涵盖Lambda表达式、Stream API、Optional类、接口默认方法等核心内容。通过丰富代码示例,深入讲解函数式编程、流式操作、空值安全处理等现代Java开发关键技术,助你提升代码质量与开发效率。
378 0
|
Nacos 微服务 监控
Nacos:微服务架构中的“服务管家”与“配置中心”
Nacos是阿里巴巴开源的微服务“服务管家”与“配置中心”,集服务注册发现、动态配置管理、健康检查、DNS发现等功能于一体,支持多语言、多协议接入,助力构建高可用、易运维的云原生应用体系。
595 155
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
GPT与BERT深度解析:Transformer的双子星架构
GPT基于Transformer解码器,擅长文本生成;BERT基于编码器,专注文本理解。二者在架构、注意力机制和训练目标上差异显著,分别适用于生成与理解任务,体现了AI智能的多元化发展。
|
1月前
|
人工智能 监控 算法
Transformer模型训练全解析:从数据到智能的炼金术
模型训练是让AI从数据中学习规律的过程,如同教婴儿学语言。预训练相当于通识教育,为模型打下通用知识基础;后续微调则针对具体任务。整个过程包含数据准备、前向传播、损失计算、反向更新等步骤,需克服过拟合、不稳定性等挑战,结合科学与艺术,最终使模型具备智能。
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
384 35
|
28天前
|
设计模式 Java 数据库连接
10大 spring源码设计模式 (图解+秒懂+史上最全)
10大 spring源码设计模式 (图解+秒懂+史上最全)
10大 spring源码设计模式 (图解+秒懂+史上最全)