从源码中学习设计模式系列——单例模式(一)

一、前言

设计模式在软件开发中有很重要的,常常是软件开发中的解决方案,在软件开发中遵循的模式有很多,大多数公司/开发人员一次只执行一个或多个模式。 它们的范围从抽象工厂(创建一个以上的类的实例)到Singleton(只有一个类的实例可以存在)。 今天我们将看看Singleton Deasign模式。

二、Singleton Deasign模式是什么

Singleton模式是一种模式,可以确保一个类只有一个实例,并为其提供全局访问点。 实现这种模式的类本身负责跟踪它的唯一实例,而不是依赖于全局变量。 

三、Singleton Deasign模式的好处和坏处

不能滥用,要根据情况使用它。 现在,在设计应用程序时,并不是所有情况都适合使用Singleton模式,如果有场景需要使用,也要确保类是无状态的。
假设您正在创建一个具有报告功能的应用程序,并且客户端想要维护生成和打印的所有报告的计数。 由于Singleton设计模式只允许一个实例,并且它是报告模块的全局访问点,所以您可以让设计人员确保始终保持准确的计数,而不必依赖全局静态变量。

四、实现

让我们来看看使用Singleton设计模式的类的实现。 这个Singleton的例子通过使用锁来实现线程的安全。 它取出Singleton类上的锁(以确保没有竞争情况发生)并检查实例是否已经存在。 如果实例不存在,那么它创建一个实例,否则它返回已经可用的实例,Locking确保一个线程可以创建一个实例。

public sealed class Singleton
{
    private static Singleton _classInstance = null;
    private static readonly object _threadSafetyLock = new object();

    Singleton() { }

    public static Singleton Instance
    {
        get
        {
            lock (_threadSafetyLock)
            {
                if (_classInstance == null)
                    _classInstance = new Singleton();
                return _classInstance;
            }
        }
    }
}

Singleton设计模式的第二种实现方法是使用双重锁定技术。 该技术解决了并发问题,避免了每次调用Instance属性时的排他锁。 这种方法还允许开发人员延迟对象的实例化,直到它首次被调用,才去实例化该对象。 让我们来看看在实现Singleton设计模式时的双重锁定技术:

public sealed class Singleton
{
    static volatile Singleton _classInstance = null;
    static readonly object _threadSafetyLock = new object();

    Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (_classInstance == null)
            {
                lock (_threadSafetyLock)
                {
                    if (_classInstance == null)
                        _classInstance = new Singleton();
                }
            }
            return _classInstance;
        }
    }
}

注意,我们将_classInstance属性变量标记为volatile,这可以确保它的值在被访问之前被设置。 这确保_classInstance始终包含最新的值。

这就是Singleton设计模式。

 单例模式讲到这里那是远远不够的,本篇文章只是先抛出一个引子,下一篇文章料很多,尽情期待!^_^

 

 

参考文章:https://dzone.com/articles/design-patterns-singleton-c

翻译:郭峥

 

 

作者:郭峥

出处:http://www.cnblogs.com/runningsmallguo/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

posted @ 2018-05-01 15:05  菠萝吹雪—Code  阅读(423)  评论(0编辑  收藏  举报