【Java 开发日记】简单讲一下有哪些常见的设计模式?

【Java 开发日记】简单讲一下有哪些常见的设计模式?

目录

1. 创建型模式

2. 结构型模式

3. 行为型模式

总结


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

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

1. 创建型模式

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

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

2. 结构型模式

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

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

3. 行为型模式

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

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

总结

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

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

如果小假的内容对你有帮助,请点赞评论收藏。创作不易,大家的支持就是我坚持下去的动力!

Read more

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务并全面实现无损语言壁垒交互 前言 在 OpenHarmony 应用向高性能计算领域扩展的过程中,如何优雅地接入已有的 C/C++ 算法库(如加密引擎、重型图像处理、数学模拟)而又不失跨平台的便捷性?传统的 NAPI 虽然稳健,但在 Flutter 生态中,直接利用 WebAssembly (WASM) 配合 FFI(External Function Interface)的语义可以在一定程度上实现代码的高度复用。wasm_ffi 库为 Flutter 开发者提供了一套在 Dart 环境下调用 WASM

By Ne0inhk
三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

文章目录 * **第一部分:引言与核心密码学概念** * **1.1 为什么IM需要端到端加密(E2EE)?** * **1.2 核心密码学概念与工具** * **第二部分:方案一:静态非对称加密(基础方案)** * **2.1 方案概述与流程** * **2.2 前端Vue实现(使用node-forge)** * **1. 安装依赖** * **2. 核心工具类 `crypto.js`** * **3. Vue组件中使用** * **2.3 后端Java实现(Spring Boot)** * **1. 实体类** * **2. Controller层** * **3. WebSocket配置** * **2.4 密钥管理、注册与登录集成** * **1. 用户注册/登录时生成密钥** * **2. 密钥设置页面** * **2.

By Ne0inhk
前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

在 AI 辅助编程领域,长期以来似乎存在一条不成文的铁律:如果你想要最好的结果,就必须为最昂贵的模型买单(通常是 Anthropic 或 OpenAI 的旗舰模型)。然而,随着国产大模型如 GLM 4.7 和 MiniMax M2.1 的迭代,这一格局正在发生剧烈震荡。 最近,一场针对Claude Opus 4.5、Gemini 3 Pro、GLM 4.7 和 MiniMax M2.1 的前端 UI生成横向测评,打破了许多人的固有认知。在这场包含落地页、仪表盘、移动端应用等五个真实场景的较量中,不仅出现了令人咋舌的“滑铁卢”,更诞生了性价比极高的“新王”。 本文将深入拆解这场测试的细节,透过代码生成的表象,探讨大模型在工程化落地中的真实效能与成本逻辑。

By Ne0inhk
【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * JavaScript 正则表达式详解 * 什么是正则表达式🤔 * JavaScript 正则表达式的定义与使用🥝 * 1. 字面量语法 * 2. 常用匹配方法 * test() 方法🍋‍🟩 * exec() 方法🍋‍🟩 * 正则表达式的核心组成部分🐦‍🔥 * 1. 元字符 * 边界符 * 量词 * 字符类 * 2. 修饰符 * 简单示例🍂 JavaScript 正则表达式详解 正则表达式是处理字符串的强大工具,在 JavaScript 中被广泛应用于表单验证、文本处理和数据提取等场景。本文将从正则表达式的基本概念出发,详细介绍其语法规则和实际应用方法。 什么是正则表达式🤔 正则表达式是用于匹配字符串中字符组合的模式,在 JavaScript

By Ne0inhk