首页 > 其他分享 >单例模式

单例模式

时间:2024-03-07 16:12:47浏览次数:17  
标签:对象 模式 single 实例 线程 单例 static

1.什么单例模式?

确保一个类只有一个实例,并提供一个全局访问点,能够帮助开发者创建一个唯一的实例

2.单例模式怎么实现?

    //单线程
    //懒汉式,线程不安全
    public class Singleton01
    {
        //定义一个静态变量
        private static Singleton01 single;
        //构造函数私有化,保证类不会被外部实例化
        private Singleton01()
        {

        }
        //定义一个静态的方法来取得类的实例
        public static Singleton01 GetInstance()
        {
            if (single == null)
            {
                single = new Singleton01();
         
            }
            return single;
        }
    }

    /// <summary>
    /// 饿汉式,线程安全
    /// 类加载到内存后就实例化一个单例
    /// 优点:简单实用,推荐实用
    /// 缺点:不管用到与否,类装载时就完成实例化
    /// </summary>
    public class Singleton02
    {
        //定义一个静态变量
        private static Singleton02 single=new Singleton02();
        //构造函数私有化,保证类不会被外部实例化
        private Singleton02()
        {

        }
        //定义一个静态的方法来取得类的实例
        public static Singleton02 GetInstance()
        {
            return single;
        }
    }
    /// <summary>
    /// 双重检查锁
    /// </summary>
    public class Singleton03
    {
        //定义一个静态变量
        private static Singleton03 single;
        //定义一个表示确保线程同步
        private static readonly Object locker = new Object();
        //构造函数私有化,保证类不会被外部实例化
        private Singleton03()
        {

        }
        //定义一个静态的方法来取得类的实例
        public static Singleton03 GetInstance()
        {
            // 当第一个线程运行到这里,此时会对locker对象“加锁”
            // 当第二个线程运行该方法时,首先检测到locker对象为“加锁”状态,该线程就会挂起等待的第一个线程解锁
            // lock语句运行完之后,会对该对象“解锁”
            if (single == null)
            {
                lock (locker)
                {
                    if (single == null)
                    {
                        single = new Singleton03();
                    }
                }
            }
            return single;
        }
    }

 

3.哪些实际应用?

使用单例模式的一些具体场景包括:

  1. 资源共享:当一个对象需要在多个部分共享访问时,可以使用单例模式。例如,在一个多线程的应用程序中,多个线程需要访问同一个资源或共享数据,使用单例模式可以确保所有线程共享同一个实例,避免资源竞争和数据不一致的问题。

  2. 对象池:当创建和销毁对象的开销较大时,可以使用单例模式创建对象池。对象池维护一组已经创建好的对象,当需要使用对象时,从对象池中获取一个对象,使用完毕后归还给对象池,避免频繁的对象创建和销毁,提高性能。

  3. 全局访问点:当需要在应用程序的不同部分访问同一个对象时,可以使用单例模式作为全局访问点。这样可以方便地在任何地方获取该对象的实例,而不需要传递对象引用。

  4. 缓存:单例模式可以用于实现缓存系统。缓存可以存储频繁使用的数据,以提高系统的性能和响应时间。使用单例模式可以确保只有一个缓存对象存在,所有部分共享同一个缓存。

标签:对象,模式,single,实例,线程,单例,static
From: https://www.cnblogs.com/wawawaaw/p/18059067

相关文章

  • 单例模式
    classCostFunctionFactory{public:EIGEN_MAKE_ALIGNED_OPERATOR_NEWCostFunctionFactory();staticboost::shared_ptr<CostFunctionFactory>instance(void);ceres::CostFunction*generateCostFunction(constCameraConstPtr&camera,......
  • 【c++八股】手撕单例模式
    懒汉模式classSingleton{public:staticSingleton&Instance(){if(instance_==nullptr)instance_=newSingleton();}returninstance_;}private:Singleton(){}~Singleton(){} //防拷贝 Singleton(c......
  • 工作中常用的6种设计模式
    谈起设计模式,你一定会问?这玩意到底有啥用?我好像没用过也不影响做一个码农。也可能项目中实际用了,但是你不自知。虽然Java设计模式有23种,但是工作中常用的可能并没有那麽多。就像新华字典有多少字,你没必要都学一样。本章我们只谈常用的几种设计模式,通过设计模式的理念、规约、到应......
  • C# 控制台禁用快速编辑模式、在指定行更新文本、注册Ctrl+C事件处理器
    在第三行更新文本 代码如下usingMicrosoft.Win32.SafeHandles;usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading;classProgram{[DllImport("kernel32.dll")]staticexternSafeFileHandleGetStdHandle(intnStdHandle);......
  • (续)signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library) —— 强化学
    前文:signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library)——强化学习ppo算法库sample-factory的多进程包装器,实现类似Qt的多进程编程模式(信号与槽机制)——python3.12版本下成功通过测试......
  • 数据挖掘概念与技术 - chapter 6 - 挖掘频繁模式、关联与相关性:基本概念与方法
    ***关联推荐!频繁模式:频繁地出现在数据集中的模式,给出数据集中反复出现的联系。频繁序列模式:如有序购买一系列产品频繁结构模式:如组合购买产品sample购物篮分析:通过发现顾客放入他们购物篮中的商品之间的关联,分析顾客的购物习惯,这种关联度发现可以帮助零售商在哪些商品频繁......
  • 真香定律!我用这种模式重构了第三方登录
    分享是最有效的学习方式。博客:https://blog.ktdaddy.com/老猫的设计模式专栏已经偷偷发车了。不甘愿做crudboy?看了好几遍的设计模式还记不住?那就不要刻意记了,跟上老猫的步伐,在一个个有趣的职场故事中领悟设计模式的精髓吧。还等什么?赶紧上车吧。故事办公室里,小猫托着腮帮对......
  • c#之asp.net的管道处理模式pipeline
    管道在进入管道之前首先要知道asp.netisApi所有的请求是由IIS转发给asp.netisApiHttpWorkerRequest监听asp.netisApi中的队列,HttpWorkerRequest是管道的执行入口 注册中间件的过程在响应请求的时候会触发事件,需要Config中配置以下是HtttpAplacation中的部分事件,在请求进......
  • 在Docker中,网络模式有哪些?
    在Docker中,网络模式是用来定义容器如何与宿主机和其他容器进行网络通信的。以下是Docker中常见的网络模式及其详细解释:Bridge模式(桥接模式):这是Docker的默认网络模式。当创建一个容器时,Docker会为其分配一个独立的网络命名空间,并在宿主机上创建一个虚拟网桥(默认为docker0),容器......
  • RocketMQ—消费者的两种消费模式
    RocketMQ—消费者的两种消费模式RocketMQ消息消费的模式分为两种:负载均衡模式和广播模式,负载均衡模式表示多个消费者交替消费同一个主题里面的消息;广播模式表示每个每个消费者都消费一遍订阅的主题的消息。负载均衡模式CLUSTERING集群模式下队列会被消费者分摊,队列数量>=消......