当前位置: 首页 > 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; 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置…...

Screencast Keys深度解析:从实时事件捕获到Blender操作可视化进阶指南

Screencast Keys深度解析&#xff1a;从实时事件捕获到Blender操作可视化进阶指南 【免费下载链接】Screencast-Keys Blender Add-on: Screencast Keys 项目地址: https://gitcode.com/gh_mirrors/sc/Screencast-Keys Screencast Keys作为Blender生态系统中一款专注于操…...

CasRel关系抽取实战:对接Airflow构建SPO抽取ETL调度流水线

CasRel关系抽取实战&#xff1a;对接Airflow构建SPO抽取ETL调度流水线 1. 项目背景与价值 在日常业务中&#xff0c;我们经常需要从大量文本数据中提取结构化信息。比如从新闻文章中提取人物关系&#xff0c;从产品描述中提取规格参数&#xff0c;从客服对话中提取用户诉求等…...

SDMatte在智能硬件配套:嵌入式设备端Web服务裁剪、ARM64交叉编译与内存精简

SDMatte在智能硬件配套&#xff1a;嵌入式设备端Web服务裁剪、ARM64交叉编译与内存精简 1. 技术背景与挑战 在智能硬件领域&#xff0c;嵌入式设备通常面临资源受限的挑战&#xff1a; 计算能力有限&#xff1a;ARM架构处理器性能远低于服务器级GPU内存资源紧张&#xff1a;…...

BEYOND REALITY Z-Image创意玩法:用AI生成不同风格的人物肖像

BEYOND REALITY Z-Image创意玩法&#xff1a;用AI生成不同风格的人物肖像 1. 认识BEYOND REALITY Z-Image创作引擎 BEYOND REALITY SUPER Z IMAGE 2.0是一款基于Z-Image-Turbo Transformer架构的高精度写实人像生成模型。它通过BF16高精度推理和专属优化算法&#xff0c;能够…...

【2025最新】基于SpringBoot+Vue的疫情隔离酒店管理系统管理系统源码+MyBatis+MySQL

系统架构设计### 摘要 近年来&#xff0c;全球范围内突发公共卫生事件频发&#xff0c;疫情隔离酒店作为防控体系的重要环节&#xff0c;其管理效率直接关系到公共卫生安全和社会稳定。传统酒店管理模式在应对大规模隔离需求时暴露出信息滞后、资源调配低效、数据孤岛等问题&am…...

RViz实战:如何用C++在ROS中动态切换不同形状的物体(含避坑指南)

RViz实战&#xff1a;如何用C在ROS中动态切换不同形状的物体&#xff08;含避坑指南&#xff09; 在机器人开发过程中&#xff0c;RViz作为ROS生态中的三维可视化利器&#xff0c;其核心价值在于让抽象的数据变得直观可见。而Marker消息系统则是实现这种可视化的关键桥梁——它…...

手把手教你用EFR32BG22实现BLE串口透传(附GATT配置全流程)

EFR32BG22低功耗蓝牙串口透传开发实战指南 在物联网终端设备开发中&#xff0c;蓝牙串口透传是最基础也最实用的功能之一。本文将带您深入EFR32BG22芯片的蓝牙开发世界&#xff0c;从零开始构建一个高效的BLE串口透传服务。不同于简单的代码搬运&#xff0c;我们将重点关注GATT…...

【STM32实战】步进电机S型曲线算法优化与误差补偿策略

1. 为什么需要S型曲线算法 我第一次用步进电机做项目时&#xff0c;直接给电机发固定频率的脉冲让它转起来。结果电机启动瞬间发出"咔咔"的异响&#xff0c;运行起来也一顿一顿的。后来才知道&#xff0c;步进电机最怕的就是突然加速或急停&#xff0c;这会导致丢步、…...

Display Driver Uninstaller深度清理实战指南

Display Driver Uninstaller深度清理实战指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 当你遭遇游戏帧…...

MoveIt Config 配置文件完整一致性检查

检查范围&#xff08;全部核对完毕&#xff09;ros2_control xacro&#xff08;硬件接口 / 关节&#xff09;initial_positions.yaml&#xff08;初始位置&#xff09;srdf&#xff08;运动组 / 关节&#xff09;joint_limits.yaml&#xff08;关节限制&#xff09;kinematics.…...