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…….偶偷懒了……