单例模式

Posted 随学·笔记

tags:

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

其实工作中一直在使用单例模式但是一直没留意过,有空简单总结一下。

单例模式的要点有三个:

  1、是某个类只能有一个实例。

  2、是它必须自行创建这个实例。

  3、是它必须自行向整个系统提供这个实例。

从具体实现角度来说,就是以下三点:

  1、是单例模式的类只提供私有的构造函数。

  2、是类定义中含有一个该类的静态私有对象。

  3、是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。

举例代码实现:

最简单直接的单例

public class Singleton
{
    private static Singleton instance;
 
    /// <summary>
    /// 构造方法私有,外键不能通过New类实例化此类
    /// </summary>
    private Singleton()
    {
    }

    /// <summary>
    /// 此方法是本类实例的唯一全局访问点
    /// </summary>
    /// <returns></returns>
    public static Singleton GetInstance()
    {
        //如实例不存在,则New一个新实例,否则返回已有实例
        if (instance == null)
        {
            instance = new Singleton();
        }
        return instance;
    }
}

多线程安全

public class Singleton
{
    private static Singleton instance;
 
    /// <summary>
    /// 程序运行时,创建一个静态只读的进程辅助对象
    /// </summary>
    private static readonly object _object = new object();
 
    /// <summary>
    /// 构造方法私有,外键不能通过New类实例化此类
    /// </summary>
    private Singleton()
    {
    }
    /// <summary>
    /// 此方法是本类实例的唯一全局访问点
    /// (双重加锁 Double-Check Locking)
    /// </summary>
    /// <returns></returns>
    public static Singleton GetInstance()
    {
        //先判断实例是否存在,不存在再加锁处理
        if (instance == null)
        {
            //在同一时刻加了锁的那部分程序只有一个线程可以进入,
            lock (_object)
            {
                //如实例不存在,则New一个新实例,否则返回已有实例
                if (instance == null)
                {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

 

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

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块