• 设计模式学习笔记——单例模式(Singleton)


    1.特点:只需一个实例时考虑。

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

    3.类图:

    4.程序实现:

      1)懒汉式:对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。
    懒汉模式只在外部对象第一次请求实例的时候才去创建。懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快。它在整个应用的生命周期只有一部分时间在占用资源。

    public class Singleton
        {
            private static Singleton m_Instance;
    
            private Singleton()
            {
                // 将默认构造函数定义为私有,防止外部调用它实例化别的对象
            }
    
            public static Singleton GetInstance()
            {
    
                if (m_Instance == null)
                {
                    m_Instance = new Singleton();
                }
    
                return m_Instance;
            }
        }
    

      2)饿汉式:对于饿汉模式,我们可以这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。饿汉模式,它的特点是加载类的时候比较慢,但运行时获得对象的速度比较快。它从加载到应用结束会一直占用资源。

    // 定义为sealed防止派生,因为派生可能增加实例
        public sealed class Singleton
        {
            private static readonly Singleton m_Instance = new Singleton();
            private Singleton()
            {
                // 将默认构造函数定义为私有,防止外部调用它实例化别的对象
            }
    
            public static Singleton GetInstance()
            {
                return m_Instance;
            }
        }
    

      3)使用锁机制

    public class Singleton
        {
            private static Singleton m_Instance;
    
            static readonly object o = new object();
    
            private Singleton()
            {
                // 将默认构造函数定义为私有,防止外部调用它实例化别的对象
            }
    
            public static Singleton GetInstance()
            {
                lock (o)
                {
                    if (m_Instance == null)
                    {
                        m_Instance = new Singleton();
                    }
                }
    
                return m_Instance;
            }
        }
    

      4)双重锁

    public class Singleton
        {
            private static Singleton m_Instance;
    
            static readonly object o = new object();
    
            private Singleton()
            {
                // 将默认构造函数定义为私有,防止外部调用它实例化别的对象
            }
    
            public static Singleton GetInstance()
            {
                // 这里增加了一个判断实例是否存在,只有在不存在时才给加锁,也就是在这个实例的生命周期中只加过一次锁
                if (m_Instance == null)
                {
                    lock (o)
                    {
                        if (m_Instance == null)
                        {
                            m_Instance = new Singleton();
                        }
                    }
                }
    
                return m_Instance;
            }
        }
    

      

  • 相关阅读:
    cors解决跨域
    神经网络和keras
    tensorflow笔记
    5.聚类算法-kmeans
    4.回归类算法-目标值连续型
    3.分类算法-目标值离散型
    Phaser.js开发小游戏之洋葱头摘星星
    VS Code 插件之 vscode-debug-visualizer
    Phaser.js开发小游戏之Phaser.js介绍
    微信小程序中写threejs系列之 threejs-miniprogram
  • 原文地址:https://www.cnblogs.com/ice-baili/p/4728296.html
Copyright © 2020-2023  润新知