首页 > 代码库 > Singleton 单例模式
Singleton 单例模式
单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
只有一个实例对于一些类来说很重要。让类负责保存它的唯一实例。这个类保证没有其它实例可以被创建,并且它提供一个访问该实例的方法。这就是Singleton模式。
在下面的情况下可以使用单例模式。
- 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
- 当这个唯一的实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
单例模式有许多优点:
- 对唯一的实例受控访问 因为Singleton类封装它的唯一实例,所以它可以严格的控制客户怎样以及何时访问它。
- 缩小名空间 Singleton模式是对全局变量的一种改进。它避免了那些存储唯一实例的全局变量污染名空间。
- 允许对操作和表示的精化 Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。可以用所需的类的实例在运行时刻配置应用。
- 允许可变数目的实例 可以控制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 请按任意键继续. . .
Singleton 单例模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。