• 设计模式4——创建型模式之单例模式


     
     定义:单例模式(SingletonPattern),保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    类型:创建型模式

    类图

    概述:

           在很多比较大型的程序中,全局变量经常被用到。如果不用全局变量,那么在使用到的模块中,都需要用参数将全局变量传入,这是非常麻烦的。虽然要减少使用全局变量,但是如果需要,还是要用。单例模式就是对传统的全局的一种改进。单例可以做到延时实例化,即在需要的时候才进行实例化。针对一些大型的类,延时实例化是有好处的。

          需要注意的是,在C#Java中,有饿汉单例模式(即在声明变量的时候就初始化)和懒汉模式(在需要使用的时候再初始化)。而在GoF的书中,只讲到了懒汉模式,这是因为C++的静态变量在初始化时具有不确定性。同一个类中的静态变量初始化与其声明顺序一致,但是不同类中的静态变量初始化顺序却是不确定的。

          另外在多线程中,需要注意访问的临界区,需要加Lock用以控制。

    代码:添加了一个静态对象用来处理内存垃圾回收。

     
    // C++
    class CSingleton
    {
        // ,
    private:
        CSingleton()
        {
        }
     
    public:
        static CSingleton* GetInstance()
        {
            if (NULL == m_pSingleton)
                m_pSingleton = new CSingleton();
     
            return m_pSingleton;
        }
     
        void SetIdx(int _nIdx)
        {
            m_nIdx = _nIdx;
        }
     
        int GetIdx()
        {
            return m_nIdx;
        }
     
    private:
        int m_nIdx;
     
        static CSingleton* m_pSingleton;
    public:
        class CRecycle
        {
        public:
            ~CRecycle()
            {
                if (NULL !=CSingleton::m_pSingleton)
                {
                    deleteCSingleton::m_pSingleton;
                }
            }
        };
        static CRecycle m_recycle;
    };
     
    // 
    CSingleton*CSingleton::m_pSingleton = NULL;
    CSingleton::CRecycleCSingleton::m_recycle;
     
    int _tmain(int argc,_TCHAR* argv[])
    {
        CSingleton::GetInstance()->SetIdx(1);
      
    return0;
    }
     

    优缺点

    1. 优点,能够灵活地控制什么时候去访问。
    1. 缺点,和其他模块耦合性太强,作为全局变量的通病。

     

    参考资料:

    1. 《设计模式——可复用面向对象软件基础》
    2. Java与模式》
    3. 《大话设计模式》
  • 相关阅读:
    《Flutter实战·第二版》
    vue 加载本地 json文件
    如何发布自己的npm包(超详细步骤,博主都在用)_前端小丑CSDN博客_npm 发布自己的包
    前端开发常用JS功能函数
    silo相关
    配置
    RTLRegister Transfer Level
    驱动调试方法 1.查看内核打印日志 2.挂虚拟机调试
    经典版沙盒被启动
    rpcss
  • 原文地址:https://www.cnblogs.com/feihe0755/p/3510425.html
Copyright © 2020-2023  润新知