zoukankan      html  css  js  c++  java
  • 聊聊如何使用单例模式

    介绍

    单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧。

    实现方式

    1、使用lock ,保证方法只有一个线程可以进入。

     /// <summary>
        /// 单例类
        /// </summary>
        public class Singleton
        {
            private Singleton()
            {
                long lResult = 0;
                for (int i = 0; i < 100 - 000 - 000; i++)
                {
                    lResult += i;
                }
                Thread.Sleep(2000);
                Console.WriteLine($"{this.GetType().Name}完成构造....");
            }
            private static Singleton Instance = null;
            private static readonly object Singleton_Lock = new object();
            public static Singleton CreateInstance()
            {
                if (Instance == null)
                {
                    lock (Singleton_Lock)//保证方法块儿只有一个线程可以进入
                    {
                        Console.WriteLine("进入lock排队....");
                        Thread.Sleep(1000);
                        if (Instance == null)
                            Instance = new Singleton();
                    }
                }
                return Instance;
            }
    
            public static void DoNothing()
            {
                Console.WriteLine("DoNothing");
            }
    
            public void Show()
            {
                Console.WriteLine($"{this.GetType().Name} Show....");
            }
        }

    2、使用静态构造函数,由CLR调用,在类型第一次被使用前调用,且只调用一次。

     /// <summary>
        /// 单例类
        /// </summary>
        public class SingletonSecond
        {
            private SingletonSecond()
            {
                long lResult = 0;
                for (int i = 0; i < 100 - 000 - 000; i++)
                {
                    lResult += i;
                }
                Thread.Sleep(2000);
                Console.WriteLine($"{this.GetType().Name}完成构造....");
            }
            private static SingletonSecond Instance = null;
            /// <summary>
            /// 静态构造函数,由CLR调用,在类型第一次被使用前调用,且只调用一次!
            /// </summary>
            static SingletonSecond()
            {
                Instance = new SingletonSecond();
            }
            public static SingletonSecond CreateInstance()
            {
                
                return Instance;
            }
    
            public static void DoNothing()
            {
                Console.WriteLine("DoNothing");
            }
    
            public void Show()
            {
                Console.WriteLine($"{this.GetType().Name} Show....");
            }
        }

    3、使用静态字段,由CLR调用,在类型第一次被使用前初始化,且只初始化一次。

     /// <summary>
        /// 单例类
        /// </summary>
        public class SingletonThird
        {
            private SingletonThird()
            {
                long lResult = 0;
                for (int i = 0; i < 100 - 000 - 000; i++)
                {
                    lResult += i;
                }
                Thread.Sleep(2000);
                Console.WriteLine($"{this.GetType().Name}完成构造....");
            }
            /// <summary>
            /// 静态字段,由CLR调用,在类型第一次被使用前初始化,且只初始化一次!
            /// </summary>
            private static SingletonThird Instance = new SingletonThird();
           
            public static SingletonThird CreateInstance()
            {
                
                return Instance;
            }
    
            public static void DoNothing()
            {
                Console.WriteLine("DoNothing");
            }
    
            public int iNum = 0;
            public void Show()
            {
                Console.WriteLine($"{this.GetType().Name} Show..{iNum++}..");
            }
    
            public void Add()
            {
                this.iNum++;
            }
        }

    使用场景

    1、需要生成唯一序列的环境。

    2、需要频繁实例化然后销毁的对象。

    3、创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 

    4、方便资源相互通信的环境。

  • 相关阅读:
    利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)
    利用Python进行数据分析-Pandas(第五部分-数据规整:聚合、合并和重塑)
    利用Python进行数据分析-Pandas(第四部分-数据清洗和准备)
    使用VBA从工作表中读图片,以及给工作表中写文件
    利用Python进行数据分析-Pandas(第三部分)
    利用Python进行数据分析-Pandas(第二部分)
    Shape.Type属性名称及对应值列表
    利用Python进行数据分析-Pandas(第一部分)
    下载文件
    github访问很慢的解决办法
  • 原文地址:https://www.cnblogs.com/lyl6796910/p/14387576.html
Copyright © 2011-2022 走看看