设计模式篇---单例模式

news2024/9/26 5:15:05

文章目录

    • 概念
    • 结构与实现
    • 优缺点

概念

单例模式是结构最简单的设计模式,通过单例模式可以保证在整个系统中的一个类只有一个实例,从而节约系统资源。举个例子,比如windows电脑下的任务管理器只能打开一个,这个就是单例模式,如果不这样做,则会弹出多个窗口,但这些窗口显示的内容完全一样,浪费了资源。

单例模式定义:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。

单例模式有3个要点:
1、某个类只能有一个实例。
2、该类必须自行创建这个实例。
3、该类必须自行向整个系统提供这个实例。

结构与实现

单例模式只有一个类,类图如下:
在这里插入图片描述
单例类拥有一个私有的构造方法,保证外部无法通过new关键字来进行实例化,此外,它还包含一个静态私有成员变量和静态公有的工厂方法,该工厂负责检验实例的存在性并实例化自己,然后存储在成员变量中。
按照被实例化的时机,单例模式可以分为两大类,懒汉模式和饿汉模式。

1、饿汉式
当类加载的时候就进行实例化,这种方式叫做饿汉式。

public class EagerSingleton {
	//static 变量在类加载的时候就已经初始化。
    private static EagerSingleton instance = new EagerSingleton();

    //private 构造,保证外部无法访问
    private EagerSingleton() {
    }

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

2、懒汉式
故名思义,比较懒,用的时候在实例化,也叫做延迟加载。直接上doubleCheck。

public class LazySingleton {
    private static volatile LazySingleton instance = null;
    
    private LazySingleton() {
    }

    public static LazySingleton getInstance() {
        //判断是否实例化过,是的话,则直接返回。  步骤一
        if (instance == null) {
            //防止多线程同时访问,造成多次实例化。
            synchronized (LazySingleton.class) {
                //两个线程情况下,A线程走到这里,B线程还在synchronized 外等待,
                // 当B线程进入synchronized后,A线程已经实例化完成,所以需要再次判断,防止多次实例化。
                if (instance == null) {
                // 步骤二
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }
}

这里之所以使用volatile来修饰,是为了保证原子性和有序性。
实例化一个对象主要分为三部分
1、先给对象分配一个内存空间。
2、创建该对象的引用
3、将该引用指向该存储空间。

当线程A走到上面代码的步骤二时,仅仅是完成了上面实例化对象三步中的第一步,但线程B这时候走到了上面代码的步骤一,判断不为null,则直接返回,此时对象还未实例化完成,这就发生了错误,所以需要使用volatile来进行修饰。

3、使用静态内部类
使用静态内部类也是懒汉式的方式之一,代码如下

public class InnerClassSingleton {


    private static class InnerClass {
        private static InnerClassSingleton instance = new InnerClassSingleton();
    }

    private InnerClassSingleton() {
    }

    public static InnerClassSingleton getInstance() {
        return InnerClass.instance;
    }
}

只有当第一次调用内部类的时候,才会实例化该变量,从而保证了单例性。

优缺点

优点:
1、单例模式自己对外提供了唯一的实例,可以控制客户的使用。
2、节约系统资源。
缺点:
1、因为没有抽象层,扩展性较差。
2、违背单一职责,该类既创建对象又有业务方法,将对象的创建和使用耦合在了一起。
3、状态丢失。如果实例出来的对象长期不使用,会被垃圾回收,下次会创建出和之前不同的对象。

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

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

相关文章

【C语言进阶】程序员必备技能之文件操作

目录 🥅什么是文件: 🏑程序文件:🏑数据文件: 🏑文件名: 🥅文件的打开和关闭:🏑文件指针: 🏑fopen和fclose: &a…

genlogic GLG -CE 4.3 For Java/C#/C++ Crack

GLG CE工具包是一个极其灵活和强大的图形框架,用于构建显示实时数据的可视化界面,例如过程控制和监控的操作员显示、SCADA / HMI模拟和图表、 交通、遥测和网络监控显示,以及其他任务关键应用程序。 航电仪表板演示 该工具包包括 用于创建动…

面向对象三大特征

面向对象三大特征 众所周知,面向对象有三大特征 封装继承多态 封装继承多态,就好像武侠小说里的“金、木、水、火、土”一样,相生相克 封装 封装就像是武侠里的金钟罩铁布衫,把对象的数据和方法封装起来,对外只暴露…

C语言strstr函数的使用和模拟实现

strstr 函数原型: char *strstr( const char *string, const char *strCharSet );const char *string 要搜索的字符串const char *strCharSet 子串char *strstr 返回第一个出现字串的起始地址,方便函数链式访问 函数作用: 在 string 字符串…

逻辑越权之验证码|token|接口(36)

token是类似于会话一串数字代表数据包的唯一性,数据包的编号,防止一些csrf,或者一些存放数据包的攻击;一般数据包里面有token,就会检验数据包的唯一性,就会造成提交数据包,被token拦截掉。 验证…

第八章 图像压缩

文章目录 第八章 图像压缩8.1基础知识8.1.1 编码冗余8.1.4图像信息的度量8.1.5保真准则8.1.6图像压缩模型8.17图像格式、容器和压缩标准 8.2一些基本的压缩方法8.2.1霍夫曼编码8.2.2Golomb编码8.2.3算术编码8.2.4LZW编码8.2.5行程编码8.2.6基于符号的编码8.2.7比特平面编码8.2.…

JVM调优常用的工具JPS、JMAP、JSTAT、JSTACK和JCMD的使用详解

查看PID信息 首先启动一个服务 使用jps 和 jps -l 的区别,使用jps -l 能够显示出服务的名称 熟悉JVM调优中常用的工具JMAP、JSTAT和JSTACK JMAP、JSTAT和JSTACK是Java开发中常用的工具,用于分析和调试Java应用程序。它们的使用场景如下: JMA…

S7 1200 CM1241组态modbus rtu

S7 1200 V4.5版本 CM1241 V2.0版本 1 一开始遇到问题 CM1241 绿色灯一直闪烁, PLC 显示LED红色错误 网上查找可能固件不匹配 我一开始选的V2.2 最后选到V2.0才行 如果CM1241 绿灯变为常亮, 这样才是正确组态 如果不是常亮,那么是没有输出的 2 程序 弄了M1.0来启动配置m…

K-means算法

文章目录 1. K-means算法简介2. K-means算法原理2.1 算法具体步骤2.2 k取值方法2.2.1 手肘法2.2.2 轮廓系数法 2.3 K-means2.4 算法终止条件 3. K-means算法特点4. K-means算法应用场景5. K-means算法的Python应用5.1 K-means算法的Python实现5.2 sklearn.cluster.Kmeans函数的…

【Linux】timerfd——定时器

文章目录 前言认识 timerfdAPI timerfdAPI clock 官方示例简单使用epoll实现 前言 在 Linux 系统编程中,使用 timerfd 实现定时器功能是一种更加可靠、高效、灵活的方式。本文是对 timerfd 的简单使用,不涉及太过深入知识,熟练掌握几个常用 …

该死的科斯定理和三条保命原则

* * * 原创:刘教链 * * * 号外:今天在“刘教链”公众号次条发表了《内参:美联储下半年加息时间表和路径》,一号两文无法直接链接,请大家点击公众号卡片进入文章列表打开阅读。星球会员可以直接打开知识星球或discord …

企业级微服务架构实战项目--xx优选3-mq+nacos+es实现上下架

一 nacosmqes实现上下架 1.1 架构图 1.2 工程结构 1.3 核心代码流程 1.3.1 请求product模块 2.修改数据库,推送rabbitmq中 1.3.2 rabbitmq的工具类 1.3.3 search模块中rabbit客户端订阅信息 1.监听器监听信息 2.调用相应的上下架方法 2.1 调用product模块&…

c#网编实验五--WCF和TCP消息通信实验

分别编写服务端和客户端程序,利用基于WCF的TCP技术,实现在线聊天功能,完成在线用户列表管理,消息发送、接收的功能。 在同一个解决方案中,分别编写服务端程序和客户端程序,利用TCP实现简单的群聊功能。 具…

【领域驱动设计专题】一文带领你透视DDD领域驱动模型的本质和设计原理分析指南(构建领域知识)

一文带领你透视DDD领域驱动模型的本质和设计原理分析指南 前提介绍传统的软件设计方案瀑布设计方法敏捷方法学敏捷方法学的问题和局限性 构建领域知识认识和了解领域内容实体模型介绍分析飞行计划路线(route)路线(route) 领域专家进行交流,相互交换知识挖掘出关键的…

一台服务器最大能支持多少条 TCP 连接

一、一台服务器最大能打开的文件数 1、限制参数 我们知道在Linux中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux上能打开的最大文件数量受三个参数影响,分别是: fs.file-max (系统级别参数)&a…

npm发布自己的包

按照上面流程操作

基于Echarts构建停车场数据可视化大屏

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

XSS—存储型xss

xss >跨站脚本攻击>前端代码注入>用户输入的数据会被当做前端代码执行。 原理:使用者提交的XSS代码被存储到服务器上的数据库里或页面或某个上传文件里,导致用户访问页面展示的内容时直接触发xss代码。 输入内容后直接在下方回显,回…

【Python 随练】今天是哪一天?

题目: 输入某年某月某日,判断这一天是这一年的第几天? 简介: 在本篇博客中,我们将使用Python代码解决一个日期相关的问题:如何确定某一天是给定年份的第几天。我们将提供问题的解析,并给出一…

领导看了给你加薪!python +ddt+excel 一招鲜,接口自动化测试轻松搞定,测试报告惊艳四座!

“ 接口自动化测试是指通过编写代码或使用工具,模拟用户发送请求,验证接口是否符合设计规范和功能需求的过程。” 如何用 python ddtexcel 实现接口自动化测试 接口自动化测试可以提高测试效率和质量,节省测试成本和时间,保证测试…