ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**定义**:单例模式(SingletonPattern),保证一个类仅有一个实例,并提供一个访问它的全局访问点。 类型:创建型模式 类图: ![](https://box.kancloud.cn/2016-08-19_57b6abd31cbe8.jpg) **概述**:       在很多比较大型的程序中,全局变量经常被用到。如果不用全局变量,那么在使用到的模块中,都需要用参数将全局变量传入,这是非常麻烦的。虽然要减少使用全局变量,但是如果需要,还是要用。单例模式就是对传统的全局的一种改进。单例可以做到延时实例化,即在需要的时候才进行实例化。针对一些大型的类,延时实例化是有好处的。      需要注意的是,在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. 《设计模式——可复用面向对象软件基础》 1. 《Java与模式》 1. 《大话设计模式》