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


    一、前言

    设计模式在软件开发中有很重要的,常常是软件开发中的解决方案,在软件开发中遵循的模式有很多,大多数公司/开发人员一次只执行一个或多个模式。 它们的范围从抽象工厂(创建一个以上的类的实例)到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/

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

  • 相关阅读:
    5. JVM虚拟机栈
    4. 程序计数器
    3. JVM运行时数据区
    2. 类加载
    1. JVM体系结构
    SpringCloud 网关组件Gateway
    SpringCloud Hystrix断路器的基本使用
    SpringCloud Ribbon和Feign 的使用和源码分析
    反向代理的概念
    事务mysql
  • 原文地址:https://www.cnblogs.com/runningsmallguo/p/8976316.html
Copyright © 2020-2023  润新知