//****************************************************************
//3.5 SINGLETON(单件)—对象创建型模式
//1. 意图
// 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
//2. 动机
// 对一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打
//印机,但却只应该有一个打印假脱机( printer spooler),只应该有
//一个文件系统和一个窗口管理器。一个数字滤波器只能有一个A / D转换
//器。一个会计系统只能专用于一个公司。
// 我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?
//
一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。// 一个更好的办法是,让类自身负责保存它的唯一实例。这个类可以保
//证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可
//以提供一个访问该实例的方法。这就是Singleton模式。
//3. 适用性
// 在下面的情况下可以使用Singleton模式
//. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
//. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改
//代码就能使用一个扩展的实例时。
//4. 结构
//5. 参与者
//. Singleton
//— 定义一个GetInstance操作,允许客户访问它的唯一实例。GetInstance
//是一个类操作(即Smalltalk中的一个类方法和C++中的一个静态成员函数)。
//— 可能负责创建它自己的唯一实例。
//6. 协作
//. 客户只能通过Singleton的GetInstance操作访问一个Singleton的实例。
//7. 效果
// Singleton模式有许多优点:
//1) 对唯一实例的受控访问因为Singleton类封装它的唯一实例,所以它可
//以严格的控制客户怎样以及何时访问它。
//2) 缩小名空间Singleton模式是对全局变量的一种改进。它避免了那些存
//储唯一实例的全局变量污染名空间。
//3) 允许对操作和表示的精化Singleton类可以有子类,而且用这个扩展类
//的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行
//时刻配置应用。
//4) 允许可变数目的实例这个模式使得你易于改变你的想法,并允许
//Singleton类的多个实例。此外,你可以用相同的方法来控制应用所使用的
//实例的数目。只有允许访问Singleton实例的操作需要改变。
//5) 比类操作更灵活另一种封装单件功能的方式是使用类操作(即C++中的
//静态成员函数或者是Smalltalk中的类方法)。但这两种语言技术都难以改
//变设计以允许一个类有多个实例。
// 此外,C++中的静态成员函数不是虚函数,因此子类不能多态的重定义它们。
//8. 实现
1 class Singleton{
2 static std::auto_ptr<Singleton> m_pInstance;
3 protected:
4 //prevent user making our any instance by manually
5 Singleton(){}
6 public:
7 ~Singleton(){}
8
9 //Return this singleton class´ instance pointer
10 static Singleton* Instance(){
11 if(!m_pInstance.get()){
12 m_pInstance = std::auto_ptr<Singleton>(new Singleton());
13 }
14 return m_pInstance.get();
15 }
16 };