聊聊如何使用单例模式

本文转载自微信公众号「UP技术控」,作者conan5566。转载本文请联系UP技术控公众号。

介绍

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

实现方式

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

///  
    /// 单例类 
    ///  
    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调用,在类型第一次被使用前调用,且只调用一次。

///  
    /// 单例类 
    ///  
    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; 
        ///  
        /// 静态构造函数,由CLR调用,在类型第一次被使用前调用,且只调用一次! 
        ///  
        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调用,在类型第一次被使用前初始化,且只初始化一次。

///  
    /// 单例类 
    ///  
    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}完成构造...."); 
        } 
        ///  
        /// 静态字段,由CLR调用,在类型第一次被使用前初始化,且只初始化一次! 
        ///  
        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、方便资源相互通信的环境。