1,功能:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2,基本思想:让类自身负责保存它的唯一实例。这个类保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
3,适用情况:
4,案例举例
线程池,数据库连接池,系统参数配置,Calendar,以及偶即将总结的抽象工厂”Abstract Factory”,等等。
5,结构

6, 优点
A. Singleton类封装它的唯一实例,所以它可以严格控制客户访问它的方法和时机;
B. Singleton类可以被继承,其子类可以实现对操作的扩展,从而对具体的应用进行扩展;
C. Singleton是全局变量的改进,它的实例全局可见;同时,同一个类型的对象只会有一个实例(当然,可以多定义几个静态变量,生成多个实例,但是显而易见,生成多少个实例完全是偶们可以控制的);而且,Singleton对象可以在使用时才创建,不需要像全局对象一样,不管你用不用都得创建。
7, 实现:
1)最简单的Singleton类
2)Singleton的子类继承
class
Singleton
{
public
:
//
Static 成员不能是虚函数,不能多态实现,因此Instance的实现不能在基类中
// static Singleton * Instance();
protected
:
Singleton(){}
private
:
static Singleton *
m_instance;
private
:
Singleton(const Singleton &
);
Singleton & operator=(const Singleton &
);
};
Singleton * Singleton::m_instance =
NULL;
class ChildSingleton : public
Singleton
{
public
:
static Singleton *
Instance();
protected
:
ChildSingleton(){}
};
Instance()的实现注意到底返回父类的实例还是子类的实例,若返回父类的实例:
Singleton
*
ChildSingleton::Instance()
{
if
(m_instance
==
NULL)
m_instance
=
new
Singleton();
return
m_instance;
}
如果返回子类的实例:
Singleton
*
ChildSingleton::Instance()
{
static
ChildSingleton
*
m_instance;
//
定义一个子类的实例的static指针
if
(m_instance
==
NULL)
m_instance
=
new
ChildSingleton();
//
创建子类实例
return
m_instance;
//
返回子类实例
}
下面的方法比较牛,兼武当与少林之所长:
template
<
class
T
>
class
Singleton
{
public
:
static
T
*
Instance()
{
static
T m_instance;
//
定义需要返回的实例,不必将其定义为成员
return
&
m_instance;
}
protected
:
Singleton(){}
private
:
Singleton(
const
Singleton
&
);
Singleton
&
operator
=
(
const
Singleton
&
);
};
3)《设计模式》中创建Singleton子类的讨论:
主要问题是如何建立子类的唯一实例。比较灵活的方法是使用一个Singleton注册表,可能的Singleton类及其子类集合不是由Instance定义的,Singleton类可以根据名字在一个众所周知的注册表中注册其实例。这个注册表在字符串名和Singleton及其子类之间建立映射。当Instance()需要一个Singleton实例时,它参考注册表来请求实例。
A,在类的构造函数中“注册”该类(可能用链表,数组等等来完成“注册表”的功能)。
B,Instance()成员函数负责在“注册表”中查找需要创建什么实例,然后创建它。通常,这需要一个类工厂来完成。
具体的东东可以参考book…….偶偷懒了……