Singleton 单例模式

单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。

只有一个实例对于一些类来说很重要。让类负责保存它的唯一实例。这个类保证没有其它实例可以被创建,并且它提供一个访问该实例的方法。这就是Singleton模式。

在下面的情况下可以使用单例模式。

  • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一的实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

单例模式有许多优点:

  1. 对唯一的实例受控访问 因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。
  2. 缩小名空间 Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。
  3. 允许对操作和表示的精化 Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。可以用所需的类的实例在运行时刻配置应用。
  4. 允许可变数目的实例 可以控制Singleton类的数目。

在实现时,将构造函数和copying方法设为protected,这样保证单例类不会被用户自己构造与拷贝。

《条款04:确定对象被使用前已先被初始化》:将每个 non-local static 对象搬到自己的专属函数内,该对象在此函数内被声明为 static。这些函数返回一个指向他所含对象的引用,non-local static 对象被 local static 对象替换了。这是单例模式的一个常见实现手法。

因此静态方法Instance()返回一个指向local static对象的指针。而静态对象仅有一个,因此所有通过Instance()得到的指针指向同一个对象。

 1 #include <iostream>
 2 
 3 class Singleton {
 4 public:
 5     static Singleton* Instance();
 6     void message();
 7 protected:
 8     Singleton() {};
 9     Singleton(const Singleton&);
10     Singleton& operator=(const Singleton&);    
11 };
12 
13 Singleton* Singleton::Instance() {
14     static Singleton _instance;
15     return &_instance;
16 }
17 void Singleton::message() {
18     std::cout << "单例模式" << std::endl;
19 }

测试单例模式

 1 #include <iostream>
 2 #include "Singleton.h"
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     Singleton* p = Singleton::Instance();
 8     p->message();
 9     Singleton* q = Singleton::Instance();
10     if (p == q) cout << "确实是单例" << endl;
11     system("pause");
12 }

测试结果

1 单例模式
2 确实是单例
3 请按任意键继续. . .
原文地址:https://www.cnblogs.com/zinthos/p/3951645.html