单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。
定义如下:
class CSingleton {
private: //构造函数是私有的
CSingleton();
static CSingleton *m_pInstance;
public:
static CSingleton *instance()
{
if(m_pInstance == NULL)
{
m_pInstance = new CSingleton();
return m_pInstance;
}
}
}
用户访问唯一实例的方法只有instance(),如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。
来看看其他做法:
class CSingleton: {
private:
CSingleton();
public:
static CSingleton& instance();
void func() { cout << "hello" << endl; }
}
CSingleton& CSingleton::instance()
{
static CSingleton obj;
return obj;
}
//全局函数
inline CSingleton& iseApp() { return CSingleton::instance(); }
int main()
{
iseApp().func();
}
使用局部静态变量,非常强大的方法,完全实现了单例的特性,而且代码量更少,也不用担心单例销毁的问题
另外补充一点:
boost::noncopyable 主要用于单例的情况.
通常情况下, 要写一个单例类就要在类的声明把它们的构造函数, 赋值函数, 析构函数, 复制构造函数隐藏到private或者protected之中, 每个类都这么做麻烦.