单例(Singleton)模式是所有模式里面最好理解,也是最容掌握的一种模式。
一、功能
保证一个类仅有一个实例。
二、结构图
三、优缺点
Singleton模式是做为"全局变量"的替代品出现的。所以它具有全局变量的特点:全局可见、贯穿应用程序的整个生命期,它也具有全局变量不具备的性质:同类型的对象实例只可能有一个。
四、实现
class Singleton
{
public:
static Singleton* Instance() ;
protected:
Singleton() {}//无法调用实例,只能指针化
private:
static Singleton *instance ;
Singleton(const Singleton&) ;//禁止复制
Singleton& operator=(const Singleton&) ;//禁止赋值
} ;
Singleton* Singleton::instance = 0 ;//初始化
Singleton* Singleton::Instance()
{
if( 0 == instance)
{
instance = new Singleton(); //lazy initialization
}
return instance ;
}
因为返回的是指针,为防止用户调用delete函数,可把static Singleton *instance;改为在Instance()中定义static Singleton instance。这样显然更安全,同时也具有lazy initialization的特性(即第一次访问时才创建)。
代码示例
Singleton* Singleton::Instance()
{
static Singleton instance;
return &instance ;
}
当然,上述两种方式只适用于单线程模式,对于多线程来说,依然可能有两个实例。有网友指出“纯C、C++语言是无法安全实现多线程安全的Singleton的”,在《Design Pattern: Singleton 模式》中以Java为例子,给出了多线程下的代码(注意synchronized 关键字)
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
synchronized static public Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
(ps虽然引述代码,还是推荐围观下讨论)
当然,无论怎么样的实现,不可能完美,满足需求就好。
CSDN上有精彩的讨论,可以去围观。