妙解设计模式之单例模式

目录

  • 单例模式的概念
    • 生活中的例子
    • 编程中的例子
  • 软件工程中的实际应用
    • 配置管理
    • 日志管理
    • 数据库连接池
    • 缓存管理
    • 线程池管理

单例模式的概念

单例模式(Singleton Pattern)是一种设计模式,用于确保一个类在整个程序运行过程中只有一个实例,并提供一个全局访问点来获取该实例。这种模式在需要控制资源使用(如数据库连接、文件访问)或者需要全局共享状态的场景中非常有用。

单例模式的具体概念

  1. 唯一实例
    • 单例模式确保一个类只有一个实例存在。任何时候,任何地方访问这个类时,都能获得相同的实例。这就避免了多个实例带来的资源浪费和状态不一致问题。
  2. 全局访问点
    • 单例模式提供一个全局访问点,可以通过这个访问点获取唯一的实例。通常是通过一个静态方法来实现。

单例模式的实现要点

  1. 私有构造函数
    • 将类的构造函数定义为私有,防止外部类直接通过new关键字创建多个实例。
  2. 静态变量
    • 使用一个私有的静态变量来保存类的唯一实例。
  3. 静态方法
    • 提供一个公共的静态方法,用于返回唯一的实例。在这个方法中,通常会检查实例是否已经存在,如果不存在则创建新的实例,如果存在则直接返回。

生活中的例子

单例模式,用来确保一个类只有一个实例,并且提供一个全局访问点来访问这个实例。想象一下你家里的冰箱。

  1. 冰箱只有一个:家里通常只有一个冰箱,不需要多个冰箱来储存食物。单例模式就像这个冰箱,确保只有一个实例存在。

  2. 全家人都能用:家里所有人都可以打开冰箱拿食物。单例模式也一样,程序中的所有部分都可以访问这个唯一的实例。

编程中的例子

下面是用Java实现单例模式的例子。我们来创建一个名为Singleton的类,确保这个类只能有一个实例,并且全局可访问。

public class Singleton {// 私有静态实例变量,用来存储唯一的实例private static Singleton instance;// 私有化构造函数,防止外部类创建实例private Singleton() {}// 公共的静态方法,返回唯一的实例public static Singleton getInstance() {// 第一次调用时创建实例,以后调用直接返回现有实例if (instance == null) {instance = new Singleton();}return instance;}// 其他方法public void showMessage() {System.out.println("Hello, I am a Singleton!");}
}class Main {public static void main(String[] args) {// 尝试获取Singleton实例Singleton singleton1 = Singleton.getInstance();Singleton singleton2 = Singleton.getInstance();// 比较两个实例,看看它们是否是同一个System.out.println(singleton1 == singleton2); // 这会打印 true// 调用实例的方法singleton1.showMessage(); // 这会打印 "Hello, I am a Singleton!"}
}

软件工程中的实际应用

配置管理

场景

  • 在一个大型应用程序中,配置参数可能需要被多个模块访问和修改。

实践

  • 使用单例模式确保配置管理类只有一个实例,从而保证所有模块访问的都是同一个配置实例,避免配置不一致的问题。
public class ConfigurationManager {private static ConfigurationManager instance;private Properties configProperties;private ConfigurationManager() {configProperties = new Properties();// 加载配置文件// configProperties.load(...);}public static synchronized ConfigurationManager getInstance() {if (instance == null) {instance = new ConfigurationManager();}return instance;}public String getProperty(String key) {return configProperties.getProperty(key);}public void setProperty(String key, String value) {configProperties.setProperty(key, value);}
}

日志管理

场景

  • 应用程序需要记录日志,并且这些日志信息需要集中管理和输出。

实践

  • 使用单例模式确保日志管理类只有一个实例,所有日志记录都通过这个实例进行处理,避免多个日志实例造成的混乱。
public class Logger {private static Logger instance;private Logger() {// 初始化日志配置}public static Logger getInstance() {if (instance == null) {instance = new Logger();}return instance;}public void log(String message) {// 记录日志信息System.out.println(message);}
}

数据库连接池

场景

  • 数据库连接是昂贵的资源,频繁创建和销毁连接会导致性能问题。

实践

  • 使用单例模式创建数据库连接池,确保全局只有一个连接池实例,从而管理和复用数据库连接,提升性能。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class DatabaseConnectionPool {private static DatabaseConnectionPool instance;private List<Connection> connectionPool;private DatabaseConnectionPool() {connectionPool = new ArrayList<>();// 初始化连接池for (int i = 0; i < 10; i++) {connectionPool.add(createNewConnection());}}public static DatabaseConnectionPool getInstance() {if (instance == null) {instance = new DatabaseConnectionPool();}return instance;}private Connection createNewConnection() {try {return DriverManager.getConnection("jdbc:yourdatabaseurl", "user", "password");} catch (SQLException e) {e.printStackTrace();return null;}}public Connection getConnection() {if (connectionPool.isEmpty()) {return createNewConnection();} else {return connectionPool.remove(connectionPool.size() - 1);}}public void releaseConnection(Connection connection) {connectionPool.add(connection);}
}

缓存管理

场景

  • 在应用程序中,某些数据需要频繁访问,但计算或获取这些数据的成本很高。

实践

  • 使用单例模式创建一个缓存管理类,确保全局只有一个缓存实例,从而共享缓存数据,提升访问速度。
import java.util.HashMap;
import java.util.Map;public class CacheManager {private static CacheManager instance;private Map<String, Object> cache;private CacheManager() {cache = new HashMap<>();}public static CacheManager getInstance() {if (instance == null) {instance = new CacheManager();}return instance;}public void put(String key, Object value) {cache.put(key, value);}public Object get(String key) {return cache.get(key);}public void remove(String key) {cache.remove(key);}
}

线程池管理

场景

  • 在并发编程中,创建和销毁线程是开销很大的操作。

实践

  • 使用单例模式创建一个线程池管理类,确保全局只有一个线程池实例,从而管理和复用线程,提升并发性能。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolManager {private static ThreadPoolManager instance;private ExecutorService executorService;private ThreadPoolManager() {executorService = Executors.newFixedThreadPool(10);}public static ThreadPoolManager getInstance() {if (instance == null) {instance = new ThreadPoolManager();}return instance;}public void execute(Runnable task) {executorService.execute(task);}public void shutdown() {executorService.shutdown();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TD3的定义 离线强化学习在医疗领域的应用

1.TD3是什么&#xff1f; TD3全称为Twin Delayed Deep Deterministic policy gradient algorithm&#xff0c;中文名称为孪生延迟深度确定性策略梯度&#xff0c;从英文名称可以看出&#xff0c;TD3是基于DDPG的一个改进算法。直接来说&#xff0c;TD3针对DDPG做出了三个方面的…

【IT小知识】堡垒机支持哪些私有云平台?

随着企业对网络安全的重视&#xff0c;以及等保政策的要求&#xff0c;越来越多的企业打算采购堡垒机。但不少企业对于堡垒机了解不多&#xff0c;一些小伙伴在问&#xff0c;堡垒机支持哪些私有云平台&#xff1f; 堡垒机支持哪些私有云平台&#xff1f; 【回答】&#xff1a…

数据分析必备:一步步教你如何用Pandas做数据分析(10)

1、Pandas 文本处理 Pandas 文本处理操作实例 在本章中&#xff0c;我们将使用基本的Series / Index讨论字符串操作。在随后的章节中&#xff0c;我们将学习如何在DataFrame上应用这些字符串函数。 Pandas提供了一组字符串函数&#xff0c;可以轻松地对字符串数据进行操作。最…

Talken - 语音命令系统

Talken - 语音命令系统 通过集成最先进的语音命令系统 Talken,释放游戏的全部潜力。 借助 Talken,您可以让玩家通过语音命令控制动作,从而重新定义游戏体验。 观看角色移动并对语音指令做出实时反应,模糊游戏与现实之间的界限。 主要特征: 🗣️ 语音驱动的游戏玩法:…

openssh生成ed25519的密钥对并实现服务器间免密钥登录

本文讲解如何用openssh生成ed25519的密钥对并实现服务器间免密钥登录。 注意&#xff1a;所有操作均在客户机侧 一、生成 ED25519 密钥 用需要免密登录的用户&#xff08;本例为username&#xff09; 运行“ssh-keygen -t ed25519 -b 256” [usernamelocalhost ~]$ ssh-keyge…

几个原则

&#xff08;1&#xff09; 成功是成功之母&#xff0c;失败不是成功之母。100分的试卷一模一样&#xff0c;不及格的试卷千奇百怪。向成功者学习。 不要研究失败&#xff0c;因为研究了一万个失败的原因&#xff0c;也不能找到一把成功的钥匙。 &#xff08;2&#xff09; 要定…

自由应用大本营?开源免费的Android应用商店:F-Droid Client

F-Droid Client&#xff1a;拥抱开源&#xff0c;守护隐私&#xff0c;让自由软件成为您生活的一部分- 精选真开源&#xff0c;释放新价值。 概览 F-Droid Client是一个开源的Android应用商店&#xff0c;它在GitHub上免费提供。这个项目致力于收集和展示各类自由及开源软件&a…

“星战之父”乔治・卢卡斯吐槽好莱坞“几乎没有原创思维”,AI 将“不可避免”用于电影制作

《星球大战》系列的创作者乔治・卢卡斯&#xff08;George Lucas&#xff09;在 1977 年奠定了电影制作传奇人物的地位&#xff0c;他对当今电影的状况及其发展方向有一些自己的看法。 他在 2024 年戛纳电影节上谈到了当前的电影行业。现年 80 岁的卢卡斯在接受法国媒体 Brut …

rviz显示realsense点云卡顿问题的解决方法

rviz显示realsense点云卡顿问题的解决方法 问题描述解决方法方法一方法二PS 尚存疑惑 问题描述 在ubuntu20.04ros noetic下 使用realsense-ros 驱动&#xff0c;运行如下命令&#xff1a; roslaunch realsense2_camera rs_camera.launch filters:pointcloud使用rviz查看点云时…

Flutter 中的 AnimatedSize 小部件:全面指南

Flutter 中的 AnimatedSize 小部件&#xff1a;全面指南 在Flutter中&#xff0c;动画是增强用户界面和提供流畅用户体验的强大工具。AnimatedSize是一个用于动画化其子组件大小变化的组件&#xff0c;它可以在大小改变时添加动画效果&#xff0c;使得界面更加生动有趣。本文将…

C# 读取 CSV 文件的方法汇总

文章目录 1. 使用System.IO命名空间中的类2. 处理标题行和指定列3. 使用CsvHelper库4. 高级功能和异常处理5. 使用 LINQ6. 总结 CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔值&#xff09;文件是一种简单的文本文件格式&#xff0c;用于存储表格数据。在C#中&a…

微服务架构-数据共享设计模式

微服务架构-数据共享设计模式 每个微服务拥有自己的数据库&#xff0c;可以独立地进行数据库架构设计、部署和维护。这种是属于常规的方式&#xff0c;不受其他微服务的影响&#xff0c;具有高度的自治性。 然而&#xff0c;在将单体应用拆分成微服务时&#xff0c;可能会遇到…

QMetaObject::invokeMethod 简介

1. QMetaObject::invokeMethod的功能和用途 QMetaObject::invokeMethod是Qt框架中的一个功能强大的方法&#xff0c;它允许你以异步的方式调用QObject派生类的成员函数。这个功能特别有用&#xff0c;因为它允许你安全地在不同的线程之间调用方法&#xff0c;而不需要担心线程…

“盲人独立生活技能提升方案”:科技点亮希望之光

在追求平等与包容的社会进程中&#xff0c;盲人群体的独立生活能力提升成为了重要议题。随着科技的飞速发展&#xff0c;一款名为“蝙蝠避障”的辅助软件应运而生&#xff0c;以其独特的实时避障和拍照识别功能&#xff0c;为盲人在旅行乃至日常生活中开辟了新的可能。这不仅是…

Golang原生http实现中间件

Golang原生http实现中间件 中间件&#xff08;middleware&#xff09;&#xff1a;常被用来做认证校验、审计等 大家常用的Iris、Gin等web框架&#xff0c;都包含了中间件逻辑。但有时我们引入该框架显得较为繁重&#xff0c;本文将介绍通过golang原生http来实现中间件操作。全…

《中国科技投资》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a; 问&#xff1a;《中国科技投资》期刊什么级别&#xff1f; 答&#xff1a;国家级 问&#xff1a;《中国科技投资》期刊是核心期刊吗? 答&#xff1a;不是&#xff0c;是万方维普收录的正规期刊。 主管单位&#xff1a;中国信息协会 主办单位&#…

【云原生_K8S系列】认识 Kubernetes

在当今数字化转型的浪潮中&#xff0c;企业对于构建高效、灵活的软件架构有了更高的期望。而在这个迅速变化的环境中&#xff0c;容器化技术如雨后春笋般涌现&#xff0c;为解决传统部署和管理软件所带来的挑战提供了一种全新的解决方案。在众多容器编排工具中&#xff0c;Kube…

5G专网驻网失败分析(suci无效)

suci 5G终端第一次驻网时&#xff0c;注册消息Registartion request中携带的5GS mobile identity要携带suci类型的mobile identity。 注册消息协议规范见5G NAS 协议3gpp TS24.501 8.2.6 Registration request。 suci协议规范参见3gpp TS24.501 9.11.3.4 5GS mobile identity …

Kubernetes Service 之原理与 ClusterIP 和 NodePort 用法

Kubernetes Service 之原理与 ClusterIP 和 NodePort 用法 Service 定义 在 Kubernetes 中&#xff0c;由于Pod 是有生命周期的&#xff0c;如果 Pod 重启它的 IP 可能会发生变化以及升级的时候会重建 Pod&#xff0c;我们需要 Service 服务去动态的关联这些 Pod 的 IP 和端口…

防止浏览器缓存了静态的配置等文件(例如外部的config.js 等文件)

防止浏览器缓存了静态的配置文件 前言1、在script引入的时候添加随机数1.1、引入js文件1.2、引入css文件2、通过html文件的<meta>设置防止缓存3、使用HTTP响应头:前言 在实际开发中浏览器的缓存问题一直是一个很让人头疼的问题,尤其是我们打包时候防止的静态配置文件c…