设计模式——单例模式(Singleton )

单例(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上有精彩的讨论,可以去围观。

原文地址:https://www.cnblogs.com/westfly/p/2113226.html