Java 设计模式一
Java 设计模式是软件开发中的一类解决方案,旨在解决常见的设计问题,提升代码的可维护性、可复用性和扩展性。它们通常基于一些经验和最佳实践,提供了解决问题的标准化方法。以下是常见的 Java 设计模式及其概述:
1. 创建型模式 (Creational Patterns)
这些模式涉及对象的创建,关注如何实例化对象而不是直接使用构造方法。
-
单例模式 (Singleton Pattern)
确保类只有一个实例,并提供全局访问点。
例:Runtime
类是单例模式的一个例子。public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;} }
-
工厂方法模式 (Factory Method Pattern)
定义一个创建对象的接口,允许子类决定实例化哪一个类。
例:java.util.Calendar
的子类可以根据系统的不同提供不同的实现。public interface Product {void use(); }public class ConcreteProduct implements Product {public void use() {System.out.println("Using ConcreteProduct");} }public abstract class Creator {public abstract Product factoryMethod(); }public class ConcreteCreator extends Creator {public Product factoryMethod() {return new ConcreteProduct();} }
-
抽象工厂模式 (Abstract Factory Pattern)
提供一个接口,用于创建一系列相关或依赖对象,而无需指定它们具体的类。
例:GUI 组件库可以通过抽象工厂来创建不同平台的按钮、文本框等控件。 -
建造者模式 (Builder Pattern)
将复杂对象的构建过程与其表示分离,使同样的构建过程可以创建不同的表示。
例:通过StringBuilder
来动态构建字符串。 -
原型模式 (Prototype Pattern)
通过复制现有的对象来创建新对象,而不是通过构造函数。
例:Object.clone()
方法是原型模式的一个实现。
2. 结构型模式 (Structural Patterns)
这些模式关注如何通过组合类和对象来获得更大的结构。
-
适配器模式 (Adapter Pattern)
将一个类的接口转换为客户希望的另一个接口,使原本接口不兼容的类可以一起工作。
例:java.io.InputStreamReader
是Reader
的适配器。public interface Target {void request(); }public class Adaptee {public void specificRequest() {System.out.println("Specific request");} }public class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}public void request() {adaptee.specificRequest();} }
-
桥接模式 (Bridge Pattern)
将抽象部分与它的实现部分分离,使得两者可以独立变化。
例:图形绘制应用中,图形(抽象)和画笔(实现)可以分别变化。 -
装饰模式 (Decorator Pattern)
动态地给一个对象添加额外的职责,而不影响其他对象。
例:Java 的java.io.BufferedReader
类是对原始Reader
类的装饰。 -
外观模式 (Facade Pattern)
为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。
例:数据库连接池的 API 提供了一个简单的接口,隐藏了复杂的连接管理过程。 -
享元模式 (Flyweight Pattern)
使用共享对象来有效地支持大量细粒度对象的复用。
例:字符串常量池就是一个享元模式的实现。 -
代理模式 (Proxy Pattern)
为其他对象提供代理,以控制对该对象的访问。
例:Java 中的java.lang.reflect.Proxy
用于生成动态代理。
3. 行为型模式 (Behavioral Patterns)
这些模式关注对象之间的通信和职责分配。
-
观察者模式 (Observer Pattern)
定义对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都得到通知并自动更新。
例:java.util.Observer
和Observable
是观察者模式的实现。 -
策略模式 (Strategy Pattern)
定义一系列算法,并将每个算法封装起来,使它们可以互换。
例:Java 中的Comparator
接口就是策略模式的实现。 -
命令模式 (Command Pattern)
将请求封装为一个对象,从而让用户可以通过不同的请求对客户进行参数化。
例:在图形应用程序中,每个操作(如移动、缩放)可以被封装成命令对象。 -
状态模式 (State Pattern)
允许一个对象在其内部状态改变时改变它的行为。
例:状态机就是状态模式的一个应用。 -
责任链模式 (Chain of Responsibility Pattern)
使多个对象都有机会处理请求,从而避免请求的发送者与接受者之间的耦合关系。
例:Java 中的Servlet
请求处理链就是责任链模式。 -
模板方法模式 (Template Method Pattern)
定义一个操作中的算法骨架,将一些步骤的实现延迟到子类中。
例:java.util.AbstractList
中的add()
方法使用了模板方法模式。 -
中介者模式 (Mediator Pattern)
用一个中介对象来封装一组对象之间的交互,使得对象之间不直接交互。
例:javax.swing
中的JButton
和JTextField
通过ActionListener
中介来交互。 -
迭代器模式 (Iterator Pattern)
提供一种方法来顺序访问一个集合中的元素,而不暴露集合的内部表示。
例:java.util.Iterator
是迭代器模式的实现。 -
访问者模式 (Visitor Pattern)
让你可以在不改变类的前提下,增加新的操作。
例:编译器的语法树中可以使用访问者模式来遍历各个节点并执行相应的操作。
总结
设计模式可以帮助开发者以更高效、更易维护的方式解决常见的开发问题。理解并应用这些模式能够使你的代码更具灵活性和扩展性。在实际开发中,我们通常不会盲目使用设计模式,而是根据实际需求来选择合适的模式。
相关文章:
Java 设计模式一
Java 设计模式是软件开发中的一类解决方案,旨在解决常见的设计问题,提升代码的可维护性、可复用性和扩展性。它们通常基于一些经验和最佳实践,提供了解决问题的标准化方法。以下是常见的 Java 设计模式及其概述: 1. 创建型模式 (…...

SOME/IP服务接口
本系列文章将分享我在学习 SOME/IP 过程中积累的一些感悟,并结合 SOME/IP 的理论知识进行讲解。主要内容是对相关知识的梳理,并结合实际代码展示 SOME/IP 的使用,旨在自我复习并与大家交流。文中引用了一些例图,但由于未能找到原作…...
Java 生成 PDF 文档 如此简单
嘿,朋友!在 Java 里实现 PDF 文档生成那可真是个挺有意思的事儿,今儿个就来好好唠唠这个。咱有不少好用的库可以选择,下面就给你详细讲讲其中两个超实用的库,一个是 iText,另一个是 Apache PDFBox。 用 iTe…...

深入探究 YOLOv5:从优势到模型导出全方位解析
一、引言 在计算机视觉领域,目标检测是一项至关重要的任务,它在自动驾驶、安防监控、工业检测等众多领域都有着广泛的应用。而 YOLO(You Only Look Once)系列作为目标检测算法中的佼佼者,一直备受关注。其中ÿ…...

【PoCL】运行 LLVM 中 pass 优化过程详解
PoCL 项目中调用 LLVM 的 Pass 对编译过程的优化至关重要。本博文以PoCL 开源项目源码为例,详细说明【PoCL】运行 LLVM 中 pass 优化过程 目录 0. 个人简介 && 授权须知1. pocl_llvm_run_pocl_passes 函数作用2. 禁止 “小网格 small grid” 工作组(workGroup)特化的…...

如何将使用unsloth微调的模型部署到ollama?
目录 一、将模型保存为gguf格式 二、下载llama.cpp 三、生成 llama-quantize 可执行文件 四、使用llama-quantize 五、训练模型 六、将模型部署到ollama 一、将模型保存为gguf格式 在你的训练代码 trainer.train() 之后添加: model.save_pretrained_gguf(&q…...

【测试】UI自动化测试
长期更新,建议关注收藏点赞! 目录 概论WEB环境搭建Selenium APPAppium 概论 使用工具和代码执行用例。 什么样的项目需要自动化? 需要回归测试、自动化的功能模块需求变更不频繁、项目周期长(功能测试时长:UI自动化测…...
SSM开发(二) MyBatis两种SQL配置方式及其对比
目录 一、MyBatis两种SQL配置方式 二、使用XML映射文件配置SQL语句 三、使用注解配置SQL语句 四、两种方式对比 总结 1、注解 2、XML配置 五、MyBatis多数据源的两种配置方式 参考 一、MyBatis两种SQL配置方式 MyBatis 提供了两种方式来配置SQL语句:注解&a…...

【Redis】在ubuntu上安装Redis
文章目录 提权搜索软件包安装修改配置文件ip保护模式配置密码 重新启动服务器使用 redis 自带的客户端来连接服务器 提权 先切换到 root 用户,su 命令切换到 root. 搜索软件包 使用 apt 命令来搜索 redis 相关的软件包 apt search redis 安装 使用 apt 命令安装 redisapt …...
JS-Web API -day06
一、正则表达式 正则表达式测试工具: http://tool.oschina.net/regex 1.1 正则表达式介绍与语法 正则表达式: 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。通常用来查…...
JS-Web API -day03
一、事件流 1.1 事件流与两个阶段说明 事件流 指的是事件完整执行过程中的流动路径 假设页面有个div标签,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段 捕获阶段:Document - Element html - Elementbody - Element div…...

进程优先级
基本概念 cpu资源分配的先后顺序,就是指进程的优先权(priority)。 优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性能;还可以把进程运⾏到指定的CPU上,这样⼀来&…...
c语言(转义字符)
前言: 内容: 然后记一下转义字符 \? 在书写连续多个问号时使用,防止他们被解析成三字母词 \ 用于表示字符常量 \\ 用于表示一个反斜杠,防止他被解析为一个转义序列符 \n 换行 \r …...

easyexcel读取写入excel easyexceldemo
1.新建springboot项目 2.添加pom依赖 <name>excel</name> <description>excelspringboot例子</description><parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…...
【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用
目录 1. 引言 2. 矩阵分解概述 2.1 矩阵分解的意义 3. 奇异值分解(SVD) 3.1 定义与数学基础 3.2 SVD 的性质 3.3 SVD 在数据降维中的应用 3.4 示例代码:使用 SVD 进行图像压缩 3.5 结果分析 4. 主成分分析(PCA࿰…...

ThreeJS示例教程200+【目录】
Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…...

DC-DC稳压电源——实战(基于Ti5450芯片)基础知识篇(1)
一:基础知识-耦合 1)去耦电容 (1)耦合与去耦 耦合:系统内部的各个部分之间存在相互依赖、相互影响、相互制约的情况。用人话说就是不同部分之间的相互影响。 去耦:自然就是消除不同部分之间的影响了。 &…...
pyrender 渲染mesh
目录 render_meshes函数 调用函数 render_meshes函数 def overlay_human_meshes(humans, K, model, img_pil, unique_colorFalse):# Color of humans seen in the image._color [color[0] for _ in range(len(humans))] if unique_color else color# Get focal and princpt …...

防火墙安全策略
目录 一.拓扑信息 二.需求分析 三.命令行详细配置信息 1.配置IP 2.交换机配置 3.修改安全区域 4.安全策略 四.web界面详细配置 1.配置IP和设置安全区域 2.交换机配置 3.安全策略 五.测试 一.拓扑信息 二.需求分析 1.VLAN 2属于办公区域;VLAN 3属于生…...
selenium clear()方法清除文本框内容
在使用Selenium进行Web自动化测试时,清除文本框内容是一个常见的需求。这可以通过多种方式实现,取决于你使用的是哪种编程语言(如Python、Java等)以及你的具体需求。以下是一些常见的方法: 1. 使用clear()方法 clear…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...