C# 设计模式-单例模式

一.介绍  

  单例模式(Singleton Pattern)。属于创建型模式。它保证一个类仅有一个实例,并提供一个访问它的全局访问点。

二.实现

  结构为,一个私有的静态变量,用于存放该实例。私有的构造函数,防止外部直接创建该类实例。

  创建单例模式有两种方式。饿汉式和懒汉式。

  饿汉式是直接在程序中初始化一个对象实例。

//饿汉式
public class Singleton
{
    /// <summary>
    /// 私有的静态变量,直接初始化
    /// </summary>
    private static Singleton Instance = new Singleton();

    /// <summary>
    /// 私有的构造函数
    /// </summary>
    private Singleton()
    {

    }

    /// <summary>
    /// 获取静态实例的静态方法
    /// </summary>
    /// <returns></returns>
    public static Singleton GetInstance()
    {
        return Instance;
    }
}

  上面饿汉式创建的单例模式有一个缺点,就是程序不使用也会创建一个实例,这样会占内存。而使用懒汉式创建的单例模式,是需要使用的时候,才去创建实例。

//懒汉式
public class Singleton2
{
    /// <summary>
    /// 私有的静态变量
    /// </summary>
    private static Singleton2 Instance = null;

    /// <summary>
    /// 私有的构造函数
    /// </summary>
    private Singleton2()
    {

    }

    /// <summary>
    /// 获取静态实例的静态方法
    /// </summary>
    /// <returns></returns>
    public static Singleton2 GetInstance()
    {
        if (Instance == null)
        {
            Instance = new Singleton2();
        }
        return Instance;
    }
}

  上面两种创建单例模式的方法在单线程使用的时候没有问题,饿汉式创建的实例在多线程中也没有问题,懒汉式创建的实例在多线程中就会出现问题。我们可以通过lock关键字在多线程中保证单例。

//单例模式 双重检查
public class Singleton3
{
    /// <summary>
    /// 私有的静态变量
    /// </summary>
    private static Singleton3 Instance = null;
    private static object locker = new object();

    /// <summary>
    /// 私有的构造函数
    /// </summary>
    private Singleton3()
    {

    }

    /// <summary>
    /// 获取静态实例的静态方法
    /// </summary>
    /// <returns></returns>
    public static Singleton3 GetInstance()
    {
        //先检查Instance是否为null,防止每次调用都锁定locker,影响性能
        if (Instance == null)
        {
            //使用lock
            lock (locker)
            {
                if(Instance == null)
                {
                    Instance = new Singleton3();
                }
            }
        }
        return Instance;
    }
}

  参考 https://www.cnblogs.com/restartyang/articles/7770856.html

posted @ 2021-01-08 11:20  shine声  阅读(933)  评论(0编辑  收藏  举报