单例模式

Posted aohost

tags:

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

单例模式顾名思义就是在程序运行过程中某个类型只有有一个实例存在。使用场景非常广泛,例如我们对日志的写入只提供一个入口等。其结构图如下

技术图片

 它保证一个类仅有一个实例,并提供一个访问它的全局访问点。 

通常的实现方式是构造一个私有的构造函数,实现外部无法对它进行实例化,然后提供一个全局的访问入口

技术图片
public class Singleton
{
    private static volatile Singleton _instance;

    private Singleton()
    {
    }

    public static Singleton GetInstance()   //提供一个唯一访问入口
    {
        if (_instance == null)
        {
            _instance = new Singleton();
        }

        return _instance;
    }
}
View Code

但是这样做在多线程下可能会出问题,如果两个线程同时进入了入口,那么系统就可能出现两个实例。通常在多线程情况下可以通过加锁来保证线程安全

技术图片
public class Singleton
{
    private static volatile Singleton _instance;    
    private static object _lock = new object();
    private Singleton() { } //构造函数设置为private,外部无法进行实例化

    public static Singleton GetInstance()
    {
        if (_instance == null)
        {
            lock (_lock)
            {
                _instance = new Singleton();
            }
        }

        return _instance;
    }
}
View Code

当然还有另外一个更加简单的实现方式

技术图片
public class Singleton
{
    private static readonly Singleton Instance = new Singleton();
    private Singleton() { }

    public static Singleton GetInstance()
    {
        return Instance;
    }
}
View Code

这种方式中的instance会在类被加载时候进行实例化,它由系统来保证线程安全。

 

该模式主要适用于当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

 

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

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

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

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

单例模式以及静态代码块