当前位置: 首页 > news >正文

设计模式--单例模式

一、单例模式代码实现

public class DatabaseConnection {// 1. 私有静态实例变量private static DatabaseConnection instance;// 2. 私有构造函数,防止外部直接创建实例private DatabaseConnection() {// 初始化数据库连接System.out.println("Database connection initialized.");}// 3. 公共静态方法,提供全局访问点public static DatabaseConnection getInstance() {if (instance == null) {// 双重检查锁定,确保线程安全synchronized (DatabaseConnection.class) {if (instance == null) {instance = new DatabaseConnection();}}}return instance;}// 4. 示例方法,模拟数据库操作public void executeQuery(String query) {System.out.println("Executing query: " + query);}
}

二、日志管理器

场景描述

在一个大型系统中,日志记录是必不可少的。为了避免重复创建日志对象,我们可以使用单例模式来设计一个 日志管理器,统一管理日志的写入和输出。

代码实现

import java.io.FileWriter;
import java.io.IOException;public class Logger {// 1. 私有静态实例变量private static Logger instance;private FileWriter writer;// 2. 私有构造函数,防止外部直接创建实例private Logger() {try {// 初始化日志文件writer = new FileWriter("app.log", true);} catch (IOException e) {e.printStackTrace();}}// 3. 公共静态方法,提供全局访问点public static synchronized Logger getInstance() {if (instance == null) {instance = new Logger();}return instance;}// 4. 日志记录方法public void log(String message) {try {writer.write(message + "\n");writer.flush();} catch (IOException e) {e.printStackTrace();}}// 5. 关闭日志文件public void close() {try {writer.close();} catch (IOException e) {e.printStackTrace();}}
}

使用场景

public class Application {public static void main(String[] args) {// 获取日志管理器的单例实例Logger logger = Logger.getInstance();// 记录日志logger.log("Application started.");logger.log("User logged in: John Doe");// 关闭日志文件logger.close();}
}

会在代码里直接生成一个app.log文件

三、配置管理器

场景描述

在项目中,通常需要读取配置文件(如 config.properties)。为了避免重复加载配置文件,我们可以使用单例模式来设计一个 配置管理器,统一管理配置的读取和访问。

代码实现

import java.util.Properties;
import java.io.FileInputStream;
import java.io.IOException;public class ConfigurationManager {// 1. 私有静态实例变量private static ConfigurationManager instance;private Properties properties;// 2. 私有构造函数,防止外部直接创建实例private ConfigurationManager() {properties = new Properties();try {// 加载配置文件properties.load(new FileInputStream("config.properties"));} catch (IOException e) {e.printStackTrace();}}// 3. 公共静态方法,提供全局访问点public static synchronized ConfigurationManager getInstance() {if (instance == null) {instance = new ConfigurationManager();}return instance;}// 4. 获取配置项public String getProperty(String key) {return properties.getProperty(key);}
}

使用场景

public class Application {public static void main(String[] args) {// 获取配置管理器的单例实例ConfigurationManager configManager = ConfigurationManager.getInstance();// 读取配置项String dbUrl = configManager.getProperty("database.url");String dbUser = configManager.getProperty("database.user");System.out.println("Database URL: " + dbUrl);System.out.println("Database User: " + dbUser);}
}

四、线程池管理器(ThreadPool Manager)

场景描述

在多线程应用中,线程池是管理线程资源的常用方式。为了避免重复创建线程池,我们可以使用单例模式来设计一个 线程池管理器,统一管理线程池的创建和任务分配。

代码实现

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolManager {// 1. 私有静态实例变量private static ThreadPoolManager instance;private ExecutorService threadPool;// 2. 私有构造函数,防止外部直接创建实例private ThreadPoolManager() {// 初始化线程池(固定大小为 10)threadPool = Executors.newFixedThreadPool(10);}// 3. 公共静态方法,提供全局访问点public static synchronized ThreadPoolManager getInstance() {if (instance == null) {instance = new ThreadPoolManager();}return instance;}// 4. 提交任务到线程池public void submitTask(Runnable task) {threadPool.submit(task);}// 5. 关闭线程池public void shutdown() {threadPool.shutdown();}
}

使用场景

public class Application {public static void main(String[] args) {// 获取线程池管理器的单例实例ThreadPoolManager threadPoolManager = ThreadPoolManager.getInstance();// 提交任务到线程池for (int i = 0; i < 20; i++) {threadPoolManager.submitTask(() -> {System.out.println("Task executed by " + Thread.currentThread().getName());});}// 关闭线程池threadPoolManager.shutdown();}
}

五、数据库连接池

场景描述

在高并发应用中,数据库连接池是管理数据库连接资源的常用方式。为了避免重复创建连接池,我们可以使用单例模式来设计一个 数据库连接池管理器,统一管理连接的获取和释放。

代码实现

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class DatabaseConnectionPool {// 1. 私有静态实例变量private static DatabaseConnectionPool instance;private List<Connection> connectionPool;private static final int POOL_SIZE = 10;// 2. 私有构造函数,防止外部直接创建实例private DatabaseConnectionPool() {connectionPool = new ArrayList<>();try {for (int i = 0; i < POOL_SIZE; i++) {Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");connectionPool.add(connection);}} catch (SQLException e) {e.printStackTrace();}}// 3. 公共静态方法,提供全局访问点public static synchronized DatabaseConnectionPool getInstance() {if (instance == null) {instance = new DatabaseConnectionPool();}return instance;}// 4. 获取数据库连接public synchronized Connection getConnection() {if (connectionPool.isEmpty()) {throw new RuntimeException("No available connections in the pool.");}return connectionPool.remove(0);}// 5. 释放数据库连接public synchronized void releaseConnection(Connection connection) {connectionPool.add(connection);}
}

使用场景

public class Application {public static void main(String[] args) {// 获取数据库连接池的单例实例DatabaseConnectionPool connectionPool = DatabaseConnectionPool.getInstance();// 获取连接Connection connection = connectionPool.getConnection();// 执行数据库操作try {// 模拟数据库操作System.out.println("Executing query...");} finally {// 释放连接connectionPool.releaseConnection(connection);}}
}

单例模式的核心思想是 确保一个类只有一个实例,并提供全局访问点,从而避免资源浪费和提高性能。

相关文章:

设计模式--单例模式

一、单例模式代码实现 public class DatabaseConnection {// 1. 私有静态实例变量private static DatabaseConnection instance;// 2. 私有构造函数&#xff0c;防止外部直接创建实例private DatabaseConnection() {// 初始化数据库连接System.out.println("Database con…...

ubuntu22.04本地部署OpenWebUI

一、简介 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离线运行。它支持各种 LLM 运行器&#xff0c;如 Ollama 和 OpenAI 兼容的 API&#xff0c;并内置了 RAG 推理引擎&#xff0c;使其成为强大的 AI 部署解决方案。 二、安装 方法 …...

2025-3-7二叉树的线索化

一、中序线索化 代码其实就是和中序遍历相似&#xff0c;增加了两个标志位 ltag rtag。 完整的代码&#xff1a; 二、先序线索化&#xff1a; 三、后序线索化&#xff1a; 总结&#xff1a;其核心其实还是遍历算法的改造。 并且注意处理最后一个被访问的节点。...

以商业思维框架为帆,驭创业浪潮前行

创业者踏入商海&#xff0c;如同航海家奔赴未知海域&#xff0c;需有清晰的思维罗盘指引方向。图中“为什么—用什么—怎么做—何人做—投入产出”的商业框架&#xff0c;正是创业者破解商业谜题的密钥&#xff0c;从需求洞察到落地执行&#xff0c;为创业之路铺就逻辑基石。 …...

海思Hi3516DV300交叉编译opencv

OpenCV是一个开源的跨平台计算机视觉库&#xff0c;支持C、Python等多种语言&#xff0c;适用于图像处理、目标检测、机器学习等任务。其核心由C编写&#xff0c;高效轻量&#xff0c;提供实时视觉处理功能&#xff0c;广泛应用于工业自动化、医疗影像等领域。 1 环境准备 1…...

基于NIST后量子算法的混合加密系统

目录 基于NIST后量子算法的混合加密系统一、前言二、后量子密码学概述2.1 后量子密码学的背景2.2 NIST候选后量子算法 三、混合加密系统的设计原理3.1 混合加密的基本思想3.2 数学公式与证明3.3 混合加密系统的优势 四、工程实现与优化策略4.1 算法层面优化4.2 工程实现优化 五…...

uni-app 开发ios 使用testFlight 进行分发测试

一、生成ipa 首先你要生成一个ipa包,怎么生成这个包,可以在uniapp打包安卓和iOS包 二、上传到分发平台 在这里我使用的是Transporter ,当然你也可以看下其他分发平台 在mac电脑app store中下载Transporter,双击打开, 点击添加,将打包好的ipa文件放上去,注意打包的时…...

Node.js入门笔记2---下载安装Node.js

Node.js入门笔记2 Node.js下载并安装的步骤1.Node.js 环境的安装2. 区分 LTS 版本和 Current 版本的不同3.项目node管理版本工具4.Node.js 包管理工具5.MSI与ZIP文件格式的主要区别6. 选择好上面的内容&#xff0c;点击下载mis7. 环境配置 Node.js下载并安装的步骤 1.Node.js …...

基于微信小程序的超市购物系统+论文源码调试讲解

4 系统设计 超市购物系统的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计阶段没有经过…...

OpenCV视频解码实战指南

硬核解析OpenCV视频处理底层原理&#xff0c;从零实现高效视频解码流水线&#xff01;附赠FFmpeg调优参数和异常帧处理方案&#xff0c;建议收藏备用。 &#x1f4fa; 视频解码核心原理 视频容器 vs 编码格式 类型常见格式特点容器格式MP4/MKV/AVI/MOV存储封装格式&#xff0…...

Python的那些事第四十三篇:功能强大的测试框架pytest

pytest:功能强大的测试框架 摘要 本文旨在深入探讨 pytest 这一功能强大的测试框架。pytest 具有简单易用、功能丰富等特点,支持分布式测试、自动化测试用例发现等功能。本文将从 pytest 的基本概念、主要功能、使用方法等多个方面进行详细阐述,并通过具体的代码示例和表格…...

工程化与框架系列(23)--前端性能优化(下)

前端性能优化&#xff08;用户体验&#xff09; &#x1f3a8; 引言 用户体验&#xff08;UX&#xff09;性能优化是前端性能优化的重要组成部分。本文将探讨如何通过优化用户体验相关的性能指标&#xff0c;提升用户对应用的满意度&#xff0c;包括感知性能、交互响应、视觉…...

使用 Elasticsearch 进行集成测试初始化​​数据时的注意事项

作者&#xff1a;来自 Elastic piotrprz 在创建应该使用 Elasticsearch 进行搜索、数据聚合或 BM25/vector/search 的软件时&#xff0c;创建至少少量的集成测试至关重要。虽然 “模拟索引” 看起来很诱人&#xff0c;因为测试甚至可以在几分之一秒内运行&#xff0c;但它们实际…...

自然语言模型(NLP)介绍

一、自然语言模型概述 自然语言模型&#xff08;NLP&#xff09;通过模拟人类语言理解和生成能力&#xff0c;已成为人工智能领域的核心技术。近年来&#xff0c;以DeepSeek、GPT-4、Claude等为代表的模型在技术突破和应用场景上展现出显著优势。例如&#xff0c;DeepSeek通过…...

解决:Word 保存文档失败,重启电脑后,Word 在试图打开文件时遇到错误

杀千刀的微软&#xff0c;设计的 Word 是个几把&#xff0c;用 LaTex 写完公式&#xff0c;然后保存&#xff0c;卡的飞起 我看文档卡了很久&#xff0c;就关闭文档&#xff0c;然后 TMD 脑抽了重启电脑 重启之后&#xff0c;文档打不开了&#xff0c;显示 杀千刀的&#xff…...

Android进程间通信方式之AIDL

Android 进程间通信&#xff08;IPC&#xff09;有多种方式&#xff0c;其中 AIDL&#xff08;Android Interface Definition Language&#xff09; 是最常用的一种&#xff0c;特别适用于 客户端-服务端&#xff08;Client-Server&#xff09;模型&#xff0c;当多个应用或进程…...

基于MD5分块哈希的前端图片重复检测方案

一、需求背景 在Web应用中处理用户图片上传时&#xff0c;我们需要解决两个核心问题&#xff1a; 避免重复文件占用存储空间 提升上传效率减少带宽消耗 传统方案直接上传后校验&#xff0c;存在以下缺陷&#xff1a; 重复文件仍然消耗上传时间 服务器重复校验增加计算压力…...

【每日学点HarmonyOS Next知识】Web Header更新、状态变量嵌套问题、自定义弹窗、stack圆角、Flex换行问题

【每日学点HarmonyOS Next知识】Web Header更新、状态变量嵌套问题、自定义弹窗、stack圆角、Flex换行问题 1、HarmonyOS 有关webview Header无法更新的问题&#xff1f; 业务A页面 打开 webivew B页面&#xff0c;第一次打开带了header请求&#xff0c;然后退出webview B页面…...

胜软科技冲刺北交所一年多转港股:由盈转亏,毛利率大幅下滑

《港湾商业观察》施子夫 近期&#xff0c;山东胜软科技股份有限公司&#xff08;以下简称&#xff0c;胜软科技&#xff09;递表港交所获受理&#xff0c;独家保荐机构为广发证券&#xff08;香港&#xff09;。 在赴港上市之前&#xff0c;胜软科技还曾谋求过A股上市&#x…...

【JavaSE-7】方法的使用

1、方法的概念和使用 1.1、什么是方法 方法&#xff08;method&#xff09;是程序中最小的执行单元&#xff0c;类似于 C语言中的函数&#xff0c;方法存在的意义&#xff1a; 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...