聊聊如何使用单例模式

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊聊如何使用单例模式相关的知识,希望对你有一定的参考价值。

介绍

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

实现方式

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、方便资源相互通信的环境。

以上是关于聊聊如何使用单例模式的主要内容,如果未能解决你的问题,请参考以下文章

清晨尝鲜,什么是单例模式?

聊聊spring中bean的作用域

Codull 的逆袭之路——你还不会单例模式吗?

单例模式的简单分析

你敢说自己了解单例模式?

你真的了解单例模式吗?