1. 单例模式的实现
class CSingleton
{
//其他成员
public:
static CSingleton* GetInstance()
{
if (m_pInstance == NULL ) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
private:
CSingleton(){};
static CSingleton *m_pInstance;
};
进一步的讨论
但是添加一个类的静态对象,总是让人不太满意,所以有人用如下方法来重现实现单例和解决它相应的问题,代码如下:
class CSingleton
{
//其他成员
public:
static Singleton &GetInstance()
{
static Singletoninstance;
return instance;
}
private:
Singleton() {};
};
使用局部静态变量,非常强大的方法,完全实现了单例的特性,而且代码量更少,也不用担心单例销毁的问题。
但使用此种方法也会出现问题,当如下方法使用单例时问题来了,
Singleton singleton = Singleton ::GetInstance();
这么做就出现了一个类拷贝的问题,这就违背了单例的特性。产生这个问题原因在于:编译器会为类生成一个默认的构造函数,来支持类的拷贝。
最后没有办法,我们要禁止类拷贝和类赋值,禁止程序员用这种方式来使用单例,当时领导的意思是GetInstance()函数返回一个指针而不是返回一个引用,函数的代码改为如下:
static Singleton *GetInstance()
{
static Singleton instance;
return &instance;
}
2. 单例会带来什么问题?
性能和多线程安全,多线程安全的单例模式可以通过加锁和双重检查来实现:
Java中的例子是:
1. public class Singleton {
2.
3. private volatile static Singleton uniqueInstance;
4.
5. private Singleton() {}
6.
7. public static Singleton getInstance() {
8. if(uniqueInstance == null) { //(1)
9. //只有第一次才彻底执行这里的代码
10. synchronized() {
11. //再检查一次
12. if(uniqueInstance == null)
13. uniqueInstance = new Singleton();
14. }
15. }
16. return uniqueInstance;
17. }
18. }