首页 > 其他分享 >重温设计模式 --- 单例模式

重温设计模式 --- 单例模式

时间:2023-07-09 21:24:03浏览次数:30  
标签:Singleton private --- instance 实例 static 单例 设计模式

引言

单例模式是一种创建型设计模式,它的主要目的是确保某个类在应用程序中只有一个实例,并且这个实例能够被全局访问。在许多情况下,单例模式是非常有用的,比如说当你需要创建一个全局的配置类或者日志类时,单例模式可以让你轻松地实现这些功能。

在实现单例模式时,有两种常见的方法,“懒汉式”和“饿汉式”

懒汉式

public class Singleton
{
    private static Singleton instance;
    
    private Singleton()
    {
        // 私有构造函数
    }
    
    public static Singleton GetInstance()
    {
        if(instance == null)
        {
            instance = new Singleton();
        }
        return instance;
    }
}

这种方式的特点是只有在需要的时候才会创建实例,而不是在类加载的时候就创建实例。这种方式可以节省系统资源,但是可能会影响性能。

懒汉式(双检锁)

上文中的实现方案中,并未考虑到线程安全,要确保在多线程环境下只有一个实例被创建,需要使用双重检查锁定,双检锁/双重校验锁(DCL,即 double-checked locking)。

public class Singleton
{
    private static Singleton instance;
    private static readonly object lockObject = new object();

    private Singleton()
    {
        // 私有构造函数
    }

    public static Singleton GetInstance()
    {
        if (instance == null)
        {
            lock (lockObject)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

饿汉式

public class Singleton
{
    private static Singleton instance = new Singleton();
    
    private Singleton()
    {
        // 私有构造函数
    }
    
    public static Singleton GetInstance()
    {
        return instance;
    }
}

这种方式的特点是在类加载的时候就创建实例,而不是在需要的时候才创建实例。这种方式可以保证线程安全,但是可能会浪费系统资源。

在使用“饿汉式”方式实现单例模式时,实例是在类加载时创建的。因此,不需要使用额外的线程安全技术。

总结

总的来说,单例模式是一种常见的设计模式,它能够确保某个类在应用程序中只有一个实例,并且这个实例能够被全局访问。但在使用“懒汉式”实现时,要注意线程安全问题。

标签:Singleton,private,---,instance,实例,static,单例,设计模式
From: https://www.cnblogs.com/pandefu/p/17536310.html

相关文章

  • JVM系列---【Arthas的下载与使用】
    Arthas的下载与使用使用jdk自带的工具,一般需要开通一些端口,添加一些jvm启动参数,比较麻烦,生产环境一般也不让重启,所以我们现在用Arthas更方便。调优的目的主要为了减少GC,因为每次GC都会调用STW机制(stoptheworld),而STW会停掉用户线程,因此频繁触发STW就会给用户感觉网站很卡。尤......
  • python-opencv核心库模块core(下)
    本章节主要记录opencv核心库模块core的图像旋转,图像拼接,图像仿射变换,图像roi区域提取和图像傅里叶变换等操作。1图像旋转opencv提供了将图像沿着坐标轴旋转的函数flip,dst=flip(src,flipcode) flipcode表示旋转的标志,等于0表示沿着x轴旋转,正数表示沿着y轴旋转,负数表示沿着x......
  • 时间序列转图像:相对位置矩阵(Relative Position Matrix)-Python版复现
    时间序列分类(TSC)在时间序列数据挖掘任务中备受关注,已经应用到各个领域。随着卷积神经网络(ConvolutionalNeuralNetwork,CNN)的迅速发展,基于卷积神经网络的TSC方法直到最近才开始出现。因此,提出了一个新的深度学习框架,使用相对位置矩阵(RelativePositionMatrix,RPM)和卷积神经......
  • python - jionlp地址解析库
    1.jionlp安装pip3install-ijionlpgithub地址https://github.com/dongrixinyu/JioNLP2.简单使用importjionlpasjio#地址address='武侯区红牌楼街19号红星大厦9楼2号'#指定参数town_village(bool),可获取乡镇、村、社区两级详细地名#指定参数change2new(bool)......
  • 开心档之Web 品质 - 国际化
    ​目录Web品质-国际化Web品质-国际化多语言支持文化差异地理位置时间和日期格式安全性可访问性总结​编辑 Web品质-国际化Web品质-国际化Web品质-国际化是指Web应用能够满足不同地区、不同文化背景、不同语言习惯的用户需求和期望,提供更好的用......
  • QNX-9—QNX官网文档翻译—Resource Managers—Handler routines
    注:本文翻译自QNXSoftwareDevelopmentPlatform-->Programming-->GettingStartedwithQNXNeutrino-->ResourceManagershttp://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.getting_started/topic/s1_resmgr_routines.html并非所有outcalls都......
  • 通用权限系统-Dozer对象转换
    Dozer对象转换介绍Dozer是一个JavaBean到JavaBean的映射器,它可以递归地将数据从一个对象复制到另一个。通常情况下,这些JavaBeans将是不同的复杂类型。Dozer支持简单的属性映射,复杂的类型映射,双向映射,隐式-显式映射,以及递归映射。这包括映射集合属性,这些集合属性也需要......
  • vue--day11--计算属性实现名字案例
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>计算属性实现名字案例</title><scrip......
  • 开心档之Web Quality - 无障碍(WAI)
    ​目录WebQuality-无障碍(WAI)WebQuality-无障碍(WAI)WebAccessibility的重要性WebAccessibility的原则1.可感知2.可理解3.可操作4.可持续WebAccessibility的技术指南结论​编辑  WebQuality-无障碍(WAI)无障碍(Accessibility)是指网站追求让......
  • 【雕爷学编程】Arduino动手做(153)---2.4寸TFT液晶触摸屏模块8
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......