很多 Java 初学者觉得设计模式 “抽象难学”,其实是没抓住核心逻辑 —— 设计模式不是 “炫技代码”,而是前辈们总结的 “解决高频复杂问题的通用思路”,好吧,你可以过一遍了解这些大概是个什么东西

不求我们能够完全理解,毕竟我们小时候家人跟我们说人生大道理我们也不太当回事

一、先明确:Java 设计模式到底是什么?

一句话总结核心:设计模式是 “针对 Java 开发中重复出现的复杂场景,前辈们总结的、可复用的代码解决思路”。

你可以从 3 个角度理解,瞬间消除 “抽象感”:

  1. 不是 “固定代码模板”,而是 “解决问题的思路”
    比如 “单例模式” 的核心思路是 “让一个类只创建一个对象”,具体代码可以有
    “双重检查锁”“静态内部类” 等多种写法,但 “只存一个实例” 的思路不变。

生活类比:“做米饭要先加水再加热” 是思路,具体用电饭锅还是高压锅,是实现方式 —— 思路统一,实现灵活。

  1. 只解决 “特定复杂问题”,不是 “万能工具”
    设计模式针对的是 “不用就会踩坑” 的场景:比如 “想避免重复创建对象浪费资源”“想动态切换支付方式又不想写一堆 if-else”“想加日志又不改动原有业务代码”。
    简单场景(比如一个工具类只提供 1 个静态方法)不需要设计模式,直接写简单代码更高效。

  2. 核心价值是 “让代码易维护、易扩展”
    没有设计模式的代码,后期迭代会变成 “一团乱麻”:比如新增支付方式要改原有代码、加日志要在每个方法里写重复逻辑。
    设计模式能让代码 “解耦”—— 新增功能不用改老代码、增强逻辑不侵入业务,后期维护不用 “牵一发而动全身”。

二、Java 开发中最常用的设计模式有哪些?

设计模式官方有 23 种,但 Java 开发者日常用得最多、面试问得最频繁的,集中在3 大类 8 种,按 “解决的核心问题” 分类,一目了然:
在这里插入图片描述

三、创建型模式

1. 单例模式(Singleton)—— 一个类只创建一个对象

  • 定义
    保证一个类在整个 Java 程序运行过程中,只有一个实例对象并且提供一个全局统一的访问入口
  • 生活例子
    公司的 “CEO”—— 全公司只有 1 位 CEO,所有部门对接 CEO 时,都只能找这同一个人,不可能同时存在两位 CEO;而且所有人都知道 “找 CEO 要通过秘书(全局入口)”,不能自己 “造一个 CEO”。
  • 业务场景
    日志工具类 :日志需要统一写入文件 / 数据库,多实例会导致日志内容错乱;
    线程池: 线程池需要控制线程数量,多实例会导致线程过多,耗尽服务器资源;
    数据库连接池:数据库连接数有限,多实例会导致连接超标,数据库拒绝访问。

2. 简单工厂模式(Simple Factory)—— 统一创建同一类对象

  • 定义
    定义一个 “工厂类”,由工厂统一创建同一类别下的所有对象(比如各种支付方式、各种日志类型),外部不用关心对象的创建细节,只需要告诉工厂
    “要什么”,就能拿到对应的对象。
  • 生活例子
    奶茶店的 “收银台”—— 顾客不用自己动手做奶茶(不用关心奶茶怎么煮、怎么加配料),只需要告诉收银台(工厂)“要珍珠奶茶” 或
    “要水果茶”,收银台就会给顾客对应的奶茶(产品)。
  • 业务场景
    支付系统:需要创建微信支付、支付宝支付、银联支付对象,用工厂根据用户选择的支付方式统一创建;
    日志系统:需要创建文件日志、控制台日志、数据库日志对象,用工厂根据配置统一创建;
    文档导出:需要创建 Excel 导出、PDF 导出、Word 导出对象,用工厂根据用户选择的格式统一创建。

3. 建造者模式(Builder)—— 分步创建复杂对象

  • 定义
    针对 “有多个属性(尤其是可选属性)的复杂对象”,将对象的创建过程拆分成多个步骤,逐步设置属性,最后统一构建出完整对象,避免创建出
    “属性不完整” 的对象。
  • 生活例子
    组装电脑 —— 电脑有 “CPU、内存、硬盘” 等必选属性(没有这些电脑无法运行),还有 “显卡、键盘、鼠标” 等可选属性(没有也能运行,但体验差)。组装时,必须先装必选部件,再按需装可选部件,最后拼成完整电脑。
  • 业务场景
    订单创建:订单有 “订单号、商品 ID、金额” 等必选属性,有 “收货地址、优惠券、备注” 等可选属性;
    用户注册:用户有 “手机号、密码” 等必选属性,有 “昵称、头像、生日” 等可选属性;
    文档生成:文档有 “标题、内容” 等必选属性,有 “作者、日期、封面” 等可选属性。

四、结构型模式

1. 代理模式(Proxy)—— 给对象加 “增强层”

  • 定义
    给 “目标对象”(核心业务对象)创建一个 “代理对象”,外部通过代理对象访问目标对象,在访问前后可以添加额外逻辑(比如日志、权限、事务),不修改目标对象的代码。
  • 生活例子
    明星的 “经纪人”—— 粉丝想找明星商演(访问目标对象),不能直接联系明星,必须通过经纪人(代理对象):经纪人会先 “筛选商演需求”(权限校验)、“记录行程”(日志),再安排明星去商演(调用目标对象方法),商演后还会 “结算费用”(后续增强)。
  • 业务场景
    Spring AOP:给 Service 方法加事务(代理在方法前开启事务,方法后提交 / 回滚);
    日志记录:给 Controller 方法加访问日志(代理在方法前记录请求参数,方法后记录返回结果);
    权限校验:给敏感接口加权限(代理在方法前判断用户是否有权限,无权限则拒绝)。

2. 策略模式(Strategy)—— 动态切换逻辑,消除 if-else

  • 定义
    将 “不同的算法 / 逻辑” 封装成独立的 “策略类”策略类之间可以互相替换,外部根据场景动态选择对应的策略,不用在代码中写大量 if-else。
  • 生活例子
    出行方式选择 —— 去公司可以选 “地铁”“公交”“打车” 三种策略:赶时间选 “打车”,想省钱选 “公交”,平衡时间和成本选 “地铁”。每种策略的 “路线、费用、时间” 独立且可以随时切换
  • 业务场景
    订单折扣:普通用户无折扣、会员 9 折、VIP8 折,根据用户等级动态选策略;**
    支付方式 :微信、支付宝、银联支付,根据用户选择动态选策略;
    排序算法:数据量小用 “冒泡排序”,数据量大用 “快速排序”,根据数据量动态选策略。

3. 装饰器模式(Decorator)—— 动态给对象加功能

  • 定义
    在不修改原有对象代码的前提下,通过 “包装” 的方式给对象动态添加新功能,并且可以灵活组合多个功能(比继承更灵活)。
  • 生活例子
    咖啡店的 “咖啡加配料”—— 一杯美式咖啡(基础对象)可以加奶泡(装饰器 1)、加糖(装饰器 2)、加冰(装饰器 3),每种配料都是一个独立的 “装饰”,可以自由组合(比如 “美式 + 奶泡 + 糖”“美式 + 冰”),且不改变咖啡本身的制作逻辑。
  • 业务场景
    日志增强:基础日志功能可以动态添加 “时间戳装饰”“用户 ID 装饰”“模块名称装饰”;
    数据加密:基础数据传输可以动态添加 “Base64 加密装饰”“MD5 加密装饰”
    IO 流扩展:Java 中的BufferedInputStream就是FileInputStream的装饰器,添加了缓冲功能。

五、行为型模式

1. 适配器模式(Adapter)—— 让不兼容的类一起工作

  • 定义
    将一个类的接口转换成客户端期望的另一个接口,使原本因接口不兼容而无法一起工作的类能够协同工作。
  • 生活例子
    手机充电器 “转接头”—— 安卓手机充电器(原有接口)不能直接给苹果手机(目标接口)充电,用一个转接头(适配器)就能让安卓充电器给苹果手机充电,转接头内部完成 “安卓接口” 到 “苹果接口” 的转换。
  • 业务场景
    老系统升级:老系统返回 XML 格式数据,新系统需要 JSON 格式,用适配器转换;
    第三方接口集成:第三方接口返回的字段名(如user_name)和本地系统(如username)不一致,用适配器映射;
    旧 API 兼容:项目中原来的Payment接口有pay(double amount)方法,新引入的支付 SDK 方法是doPayment(BigDecimal money),用适配器适配。

2. 观察者模式(Observer)—— 实现对象间的动态通知

  • 定义
    当一个对象(被观察者)的状态发生变化时,所有依赖它的对象(观察者)会自动收到通知并更新,实现 “一对多” 的动态通信。
  • 生活例子
    微信公众号 —— 你关注的公众号(被观察者)发布新文章时,所有关注该公众号的用户(观察者)都会收到推送通知,用户可以选择阅读或忽略,但公众号不需要知道具体有哪些用户关注它。
  • 业务场景
    电商库存预警:商品库存低于阈值时,自动通知 “库存管理系统”“订单取消系统”“用户提醒系统”;
    消息队列:生产者发送消息到队列(被观察者),所有订阅该队列的消费者(观察者)自动接收消息;
    GUI 事件处理:按钮(被观察者)被点击时,所有注册了点击事件的监听器(观察者)自动执行回调。

总结:8 种常用设计模式的核心价值​

这 8 种设计模式覆盖了 Java 开发中 “创建对象、组织结构、协调行为” 的核心场景,记住它们的核心解决点:

在这里插入图片描述

实际开发中,不必刻意追求 “用了多少模式”,而是当遇到对应痛点时,能想到 “用哪种模式可以更优雅地解决”—— 这才是学设计模式的最终目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94912.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94912.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/94912.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复杂BI报表SQL

复杂SQL 一行多个人员,平均瓜分总产量。 -- 西宁硅料三期 with b as ( select(row_number() OVER(PARTITION BY t1.tool ORDER BY t1.tool ) - 1) AS help_topic_id from((select1 AS tool union allselect1 AS tool union allselect1 AS tool union allselect1 AS …

bin log 和 redo log有什么区别

问题bin log 和 redo log有什么区别我的回答首先,这两种日志的作用不同。redo log是InnoDB引擎特有的,主要用于崩溃恢复,保证事务的持久性。而bin log是MySQL服务层的日志,主要用于主从复制和数据恢复。从层次上看,red…

导入文件允许合并表格

本来呢,已经有几年没咋写博客了,但是好像网上没什么好的合并导入可以抄的,周末加班了一天弄出来了,想一想也不算造轮子,可以露一手出来,最近也挺喜欢写注释的,应该方便大家抄的public class Tra…

WebIDEPLOY 技术驱动樱桃溯源管理系统的价值重塑与落地实践—— 以樱桃溯源管理系统构建产业信任体系的路径探索

一、WebIDEPLOY 技术支撑下的樱桃溯源系统核心架构樱桃种植从开花到销售的全流程数据记录,需要兼顾专业性与易操作性,WebIDEPLOY 技术以 “零代码降低门槛、云原生优化成本” 的特性,成为连接数字工具与樱桃种植的关键纽带。系统核心架构围绕…

零知开源——基于STM32F407VET6实现ULN2003AN驱动28BYJ-48步进电机控制系统

✔零知IDE 是一个真正属于国人自己的开源软件平台,在开发效率上超越了Arduino平台并且更加容易上手,大大降低了开发难度。零知开源在软件方面提供了完整的学习教程和丰富示例代码,让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品&am…

如何多个手机设备的实现不同公网IP

为了避免多个手机设备使用相同的公网IP地址导致平台检测关联,可以通过以下方法实现不同公网IP的分配和管理. 一、移动网络(SIM 卡)方案 1.移动数据与Wi-Fi切换:通过切换移动数据和不同Wi-Fi网络(如家庭Wi-Fi、公共Wi-F…

沙箱操作指南

这是一份通用且详细的沙箱操作指南。沙箱(Sandbox)是一种安全隔离环境,常用于测试未经验证的代码、软件、文件或访问可疑网址,而不会对真实系统造成危害。 本指南将分为以下几个部分: 沙箱是什么? 为什么需要使用沙箱? 如何使用沙箱?(三种主要类型) 最佳实践与注意事…

【数字IC后端】引导时钟树CTS的生成方向之anchor driver

如何控制数字IC后端CTS的生成方向?我们可以引入anchor driver来实现引导。景芯12nm车规APR实战中,我们可以看到,绝大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1这个mux,…

「Java EE开发指南」如何使用MyEclipse启用自动JSP验证?

自动JSP验证可以在两种情况下启用,在本文中您将学习如何正确使用它。 该特性在MyEclipse中可用。 MyEclipse v2025.1离线版下载 您可以在保存JSP编辑器的内容或执行“Clean”操作时启用自动JSP验证。要进行正确的验证,必须使用完整的JDK JVM启动MyEcl…

leetcode_73 矩阵置零

1. 题意 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 2. 题解 想不到O(1)的空间复杂度的做法, 只有抄抄题解这样子才能维持的了生活。 2.1 暴力 维护两个标记数组,分…

优雅地实现ChatGPT式的打字机效果:Spring Boot 流式响应

01 引言 之前专门介绍过流式响应的数据的接收、发送以及使用SSE由服务端推送数据的文章,但是要求前端必须使用EventSource订阅实现。 有没有通过直接通过浏览器访问或者Fetch API直接调用的方式呢?效果还能和ChatGPT一样,实现打字机的效果呢&…

Git 删除文件

在 Git 中,删除文件同样被视为一种修改操作。下面我们通过实际操作演示如何删除文件。假设要删除文件 file5,如果你直接在文件系统中执行了删除:这种直接删除的方式并不会在 Git 中生效,反而会导致工作区与版本库不一致。使用 git…

虚幻基础:角色变换角色视角蒙太奇运动

能帮到你的话,就给个赞吧 😘 文章目录角色视角机臂使用pawn控制旋转:旋转体将失去作用旋转体摄像机:可以使用旋转体控制:pawn不起作用角色变换角色移动:由移动组件控制移动方向:给组件任意一个方…

【LeetCode】31. 下一个排列

文章目录31. 下一个排列题目描述示例 1:示例 2:示例 3:提示:解题思路1. 问题本质与字典序回顾2. 经典算法三步曲(必须原地、常数空间)3. 直观示例与过程可视化4. 与“62. 不同路径”风格对应的分析维度4.1 …

CVPR2025丨VL2Lite:如何将巨型VLM的“知识”精炼后灌入轻量网络?这项蒸馏技术实现了任务专用的极致压缩

关注gongzhonghao【CVPR顶会精选】小模型(Small Models)通常指参数量较小、计算与存储成本更低的深度学习模型。近年来,它们在移动端部署、边缘计算和隐私保护等场景中快速发展,逐渐成为大模型的轻量化补充。随着蒸馏、剪枝、量化…

【SystemUI】锁屏来通知默认亮屏Wake模式

一、问题描述 基于 Android 14平台,锁屏状态下来通知时默认是进入Doze模式,此时屏幕不能点击只能查看通知信息且很快灭屏,用户体验不是很好,要求修改为通知直接亮屏。二、问题分析 梳理锁屏状态下(特指设备息屏或处于D…

高并发写入、毫秒级查询——盘古信息携手 TDengine 时序数据库解决六大技术挑战

小T导读:广东盘古信息科技股份有限公司(下文简称盘古信息)成立于 2005 年,是一家基于工业互联网平台的数字化管理解决方案供应商,公司自主研发的 IMS(数字化智能制造系统)可为离散、流程及混合制…

Unity 打包 iOS,Xcode 构建并上传 App Store

一、准备工作(环境、账号、证书与项目基础)系统与工具macOS:使用与最新 Xcode 兼容的版本。Xcode:从 Mac App Store 安装最新稳定版(建议与当前 App Store 必需的 Xcode 主版本保持一致)。Unity&#xff1a…

Windows系统安装stata软件教程

1、解压缩2、点击next3、选择第一个,然后next4、这里随便填写就行5、选择stataMP,然后next6、这里改个路径,例如D:\Program Files\Stata18\7、这里不用管,选择next8、点击install,开始安装过程9、安装过程展示。10、最…

Android 开发 - 数据共享(数据共享、内容提供者实现、动态权限申请)

一、数据共享 1、内容提供者 内容提供者 ContentProvider 为 APP 存取内部数据提供统一的外部接口,让不同的应用之间得以共享数据2、流程理解 Client APP 将用户的输入内容通过 ContentProvider 跨进程通信传递给 Server APP3、数据访问 利用 ContentProvider 只实现…