设计模式:单例模式

单例模式是用来保证进程中,某个类只有一个实例。因为有时候某个类很占用资源,例如:数据库连接、或者是类在构造的时候很耗费资源和时间。

单例模式的实现分为两种:饿汉式和懒汉式。前者是在静态构造函数执行时就立即实例化,后者是在程序执行过程中第一次需要时再实例化。

懒汉式

/// <summary>
    /// 懒汉式
    /// </summary>
    public class Singleton
    {

        private Singleton() //私有化构造函数,避免外部创建
        {
            long lResult = 0;
            for (int i = 0; i < 1000000; i++)
            {
                lResult += i;
            }
            Thread.Sleep(2000);
            Console.WriteLine($"{this.GetType().Name}被构造一次!");
        }

        /// <summary>
        /// 静态变量 (定义成静态变量,保障全局唯一)
        /// </summary>
        private static volatile Singleton _singleton = null; //volatile 促进线程安全
        private static object sinletonLock = new object(); 


        /// <summary>
        /// 公开的静态方法提供对象实例
        /// </summary>
        /// <returns></returns>
        public static Singleton CreateInstance()
        {
            //解决多线程调用时线程不在进行加锁然后进行判断。
            if (_singleton == null)
            {
                lock (sinletonLock)
                {
                    //保证只被实例化一次
                    if (_singleton == null)
                    {
                        _singleton = new Singleton();
                    }
                }
            }
            
            return _singleton;
        }

    }

  

懒汉式单例主要包括三部分:
1.私有化构造函数,避免外部创建。
2.公开的静态方法提供对象实例。
3. 静态变量 (定义成静态变量,保障全局唯一)。

饿汉式

public class Singleton
{
    private static readonly Singleton _instance;
    static Singleton()
    {
        _instance = new Singleton();
    }

    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }
}

  

饿汉式是在静态构造函数中立即进行实例化。注意,为了确保单例性,需要使用 readonly 关键字声明实例不能被修改。
以上写法可简写为:

public class Singleton
{
    private static readonly Singleton _instance = new Singleton();
    public static Singleton Instance
    {
        get
        {
            return _instance;
        }
    }
}

  

在 C# 7 中还可以进一步简写,一句代码就搞定了,此写法如下:

public class Singleton
{
    public static Singleton Instance { get; } = new Singleton();
}

  

posted @ 2022-04-09 21:40  #谭  阅读(54)  评论(0)    收藏  举报