保证一个类只有一个实例,并提供一个访问它的全局访问点
1.Singleton接口
class Singleton
{
public:
static Singleton& Instance();
...
private:
Singleton();//私有构造函数
Singleton(const Singleton&);//私有拷贝构造函数,不实现该函数,以防止拷贝
Singleton& operator=(const Singleton&);//赋值操作副,不实现,防止拷贝
~Singleton();//私有析构函数,防止用户delete掉该唯一的Singleton对象
};
2.多线程下的Singleton
Double-Checked Locking模式:
Singleton& Singleton::Instance()
{
if(!pInstance)
{
EnterCriticalSection();
if(!pInstance)
{
pInstance = new Singleton();
}
LeaveCriticalSection();
}
return *pInstance;
}
这种方法在java中不可靠。同时,在C++中也要看编译器。因为RISC机器可以“乱序多发射”,导致指令执行的顺序并不一定是程序指定的顺序。所以必须参考编译器文档说明。可以加volatile关键字来修饰pInstance。
3.使用静态局部变量实现Singleton
Singleton& Singleton::Instance()
{
static Singleton obj;
return obj;
}