单例模式:保证一个类仅有一个实例

news2024/11/25 7:01:21

单例模式:保证一个类仅有一个实例

欢迎来到设计模式系列的第二篇文章!在上一篇中,我们已经对设计模式有了初步的了解,今天让我们深入研究第一个模式——单例模式。

什么是单例模式?

在软件开发中,我们经常会遇到这样的情况:一个类在整个应用程序的生命周期内只需要拥有一个实例。单例模式就是为了解决这样的需求而生的。它是一种创建型设计模式,确保一个类仅有一个实例,并提供全局访问点。

为什么需要单例模式?

单例模式在许多场景中非常有用。

首先,它可以节省系统资源,因为一个类的多个实例可能会占用大量的内存空间。

其次,它可以避免对同一资源的重复创建和销毁,提高系统性能。最重要的是,单例模式可以确保实例的一致性,避免因为多个实例导致的数据不一致问题。

单例模式的实现方式

单例模式有多种实现方式,下面我们介绍两种常用的方式:懒汉式和饿汉式。

  • 懒汉式:在第一次使用时创建实例。懒汉式的优点是节省了内存空间,但可能会引发线程安全问题。下面是一个懒汉式的示例:
public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {
        // 私有构造方法
    }

    public static LazySingleton getInstance() {
        if (instance == null) {
        	synchronized(LazySingleton.class) {
				if (instance == null) {
					instance = new LazySingleton();
				}
			}
        }
        return instance;
    }
}

在懒汉式中,我们在getInstance方法中通过synchronized**关键字来保证线程安全。在首次初始化时,在并发场景下,可以实现线程安全,并导致一定的性能问题,但是在后续方法调用时,就可以直接获取对象实例了。

  • 饿汉式:在类加载时就创建实例。饿汉式的优点是线程安全,但可能会造成不必要的资源浪费。下面是一个饿汉式的示例:
public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {
        // 私有构造方法
    }

    public static EagerSingleton getInstance() {
        return instance;
    }
}

在饿汉式中,实例在类加载时就被创建,因此在多线程环境下不会有线程安全问题。

单例模式的应用

让我们通过一个具体的例子来理解单例模式的应用。

假设我们在一个游戏中需要一个全局唯一的配置管理器,用于加载和管理游戏的配置文件。在这种情况下,我们可以使用单例模式来保证只有一个配置管理器实例存在。

public class ConfigurationManager {
    private Properties properties;

    private static ConfigurationManager instance;

    private ConfigurationManager() {
        // 私有构造方法
        properties = new Properties();
        // 加载配置文件
        try {
            properties.load(new FileInputStream("config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static synchronized ConfigurationManager getInstance() {
        if (instance == null) {
        	synchronized(ConfigurationManager.class) {
				if (instance == null) {
					instance = new ConfigurationManager();
				}
			}
        }
        return instance;
    }

    public String getProperty(String key) {
        return properties.getProperty(key);
    }
}

在这个例子中,我们通过单例模式创建了一个全局唯一的配置管理器实例。无论在游戏的哪个地方都可以通过ConfigurationManager.getInstance()获取到相同的实例,并通过getProperty方法获取配置信息。

小结

单例模式是设计模式中最简单却也是最有用的一种。它解决了很多全局唯一实例的问题,确保了类的独一性和一致性。无论是懒汉式还是饿汉式,单例模式都能帮助我们构建更高效、更可靠的代码。

关注公众号,回复「书籍」、「视频」获取 "设计模式"经典书籍
在这里插入图片描述

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

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

相关文章

pyinstaller打包openvino 2021.4.2

打包准备 1. 测试环境准备 conda create -n opinstall python3.7 -y conda activate opinstall pip install openvino2021.4.2 pip install pyinstaller PyCharm新建openvino_install,选择虚拟环境opinstall,编写测试代码 app.py import numpy as n…

mysql基础下

文章目录 1.创建表和管理表1. 一条数据存储的过程2.MySQL中的数据类型3.创建表4.修改表5.重命名表6.删除表7.清空表 2.数据处理1. 插入数据2.更新数据3. 删除数据4. 将查询结果插入到表中 3. 约束1.约束概述2.非空约束3.唯一性约束4. 主键(PRIMARY KEY)约…

山西电力市场日前价格预测【2023-08-28】

日前价格预测 预测明日(2023-08-28)山西电力市场全天平均日前电价为319.70元/MWh。其中,最高日前电价为371.80元/MWh,预计出现在19: 15。最低日前电价为278.59元/MWh,预计出现在13: 00。 价差方向预测 1: …

秋招打卡016(0827)

文章目录 前言一、今天学习了什么?二、关于问题的答案1.牛客网面经2.美团后端一面3.动态规划 总结 前言 提示:这里为每天自己的学习内容心情总结; Learn By Doing,Now or Never,Writing is organized thinking. 先多…

基于海洋捕食者算法优化的BP神经网络(预测应用) - 附代码

基于海洋捕食者算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于海洋捕食者算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.海洋捕食者优化BP神经网络2.1 BP神经网络参数设置2.2 海洋捕食者算法应用 4.测试结果&…

企业使用CRM如何统一销售流程管理?

销售流程我们可以理解为,销售人员从寻找潜在客户到最终达成交易的一系列步骤。很多企业通过CRM系统来进行销售流程管理,提高销售效率,实现销售目标。下面我们就来说说,CRM如何进行销售流程管理。 制定统一的销售流程:…

关于 Camera 预览和录像画质不一样的问题分析

1、问题背景 基于之前安卓平台的一个项目,客户有反馈过一个 Camera app 预览的效果,和录像效果不一致的问题。 这里的预览是指打开 Camera app 后直接出图的效果;录像的效果则是指打开 Camera app 开启录像功能,录制一段视频&…

【算法专题突破】双指针 - 快乐数(3)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:202. 快乐数 - 力扣(Leetcode) 这道题的题目也很容易理解, 看一下题目给的示例就能很容易明白, 但是要注意一个点&#…

一篇带你了解npm的原理

npm 是 JavaScript世界的包管理工具,并且是 Node.js平台的默认包管理工具。通过 npm可以安装、共享、分发代码,管理项目依赖关系。 npm的原理 npm据称成为世界最大的包管理器?原因真的只是用户友好? 一、npm init 用来初始化一个简单的package.json文件。package.json文件…

9.3 功率放大电路的安全运行

在功率放大电路中,功放管既要流过大电流,又要承受高电压。例如,在 OCL 电路中,只有功放管满足式(9.2.13)所示极限值的要求,电路才能正常工作。因此,所谓功率放大电路的安全运行&…

微服务学习资料

文章目录 参考资料一. 微服务概述1. CAP理论2. BASE理论3. SpringBoot 与 SpringCloud对比 二. 服务注册:Zookeeper,Eureka,Nacos,Consul1. Nacos两种健康检查方式?2. nacos中负责负载均衡底层是如何实现的3. Nacos原理4. 临时实例和持久化(非临时)实例 …

【数据结构与算法篇】手撕八大排序算法之交换排序

​👻内容专栏: 《数据结构与算法篇》 🐨本文概括:常见交换排序包括冒泡排序与快速排序,本篇讲述冒泡排序与快速排序的思想及实现、复杂度分析。 🐼本文作者: 花 蝶 🐸发布时间&#…

表和Json的相互操作

目录 一、表转Json 1.使用 for json path 2.如何返回单个Json 3.如何给返回的Json增加一个根节点呢 4.如何给返回的Json增加上一个节点 二、对Json基本操作 1.判断给的字符串是否是Json格式 2.从 JSON 字符串中提取标量值 3. 从 JSON 字符串中提取对象或数组 4. 更…

计网-All

路由器的功能与路由表的查看_路由器路由表_傻傻小猪哈哈的博客-CSDN博客路由基础-直连路由、静态路由与动态路由的概念_MikeVane-bb的博客-CSDN博客路由器的功能与路由表的查看_路由器路由表_傻傻小猪哈哈的博客-CSDN博客 直连路由就是路由器直接连了一个网段,他就…

在线考试系统java线上答题问答jsp源代码MySQL

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 在线考试系统 系统有2权限:管理员、学生 …

ChatGPT 与前端技术实现制作大屏可视化

像这样的综合案例实分析,我们可以提供案例,维度与指标数据,让ChatGPT与AIGC 帮写出完整代码,并进行一个2行2列的布局设置。 数据与指令如下: 商品名称 销量 目标 完成率 可乐 479 600 79.83% 雪碧 324 600 54.00% 红茶 379 600 63.…

NoSQL数据库介绍+Redis部署

目录 一、NoSQL概述 1、数据的高并发读写 2、海量数据的高效率存储和访问 3、数据库的高扩展和高可用 二、NoSQL的类别 1、键值存储数据库 2、列存储数据库 3、文档型数据库 4、图形化数据库 三、分布式数据库中的CAP原理 1、传统的ACID 1)、A--原子性 …

webassembly001 webassembly简述

WebAssembly 官方地址:https://webassembly.org/相关历史 https://en.wikipedia.org/wiki/WebAssembly https://brendaneich.com/2015/06/from-asm-js-to-webassembly/WebAssembly(缩写为Wasm)是一种基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为编…

【C语言练习】牛客题库第(一)期

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

攻防演练期间一次对某企业的渗透测试

免责声明 由于传播、利用本文章说黑客所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者说黑客不为此承担任何责任,一旦造成后果请自行承担! 前言 某次攻防演练中,主办方只提供了目标…