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…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
