**定义**:单例模式(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. 《大话设计模式》
- 前言
- 设计模式六大原则
- 1——创建型模式之简单工厂模式
- 2——创建型模式之工厂方法模式
- 3——创建型模式之抽象工厂模式
- 4——创建型模式之单例模式
- 5——创建型模式之建造者模式
- 6——创建型模式之原型模式
- 7——结构型模式之适配器模式
- 8——结构型模式之桥接模式
- 9——结构型模式之组合模式
- 10——结构型模式之装饰者模式
- 11——结构型模式之外观模式
- 12——结构型模式之享元模式
- 13——结构型模式之代理模式
- 14——行为型模式之职责链模式
- 15——行为型模式之命令模式
- 16——行为型模式之解释器模式
- 17——行为型模式之迭代器模式
- 18——行为型模式之中介者模式
- 19——行为型模式之备忘录模式
- 20——行为型模式之观察者模式
- 21——行为型模式之状态模式
- 22——行为型模式之策略模式
- 23——行为型模式之模板方法模型
- 24——行为型模式之访问者模式
- 设计模式总结