- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Singleton 式是一种非常简单的设计 式,这种 式很常用也很容易被滥用。当你设计应用程
序的时候,经常会遇到某些对象在整个程序的生命周期应该仅有一个实例的情况,比如File
System Grap hic System Logging Utility,这时候就可以用到Singleton 式。Singleton
式在GOF 中描述如下:
Ensure a class only has one instance, and provide a global point of access to it.
Singleton 式的定义很简单,实现也有N 多种,但是却很难找到一个称得上 完美”的。实现一
个完美的Singleton 比想象中要难的多,下面探索性的来实现一个非完美的。
1. 型实现
在C++中,Singleton 式的典型实现如下:
1 // Header file Singleton.h
2 class Singleton {
3 public :
4 static Singleton Instance() { // Unique point of access
5 if (0 == _instance)
6 _instance = new Singleton();
7 return * _instance;
8 }
9 void DoSomething();
10 private :
11 Singleton(); // Prevent clients from creating a new Singleton
12 ~Singleton(); // Prevent clients from deleting a Singleton
13 Singleton(const Singleton); // Prevent clients from copyin
g a Singleton
14 Singleton operator=(const Singleton );
15 private :
16 static Singleton *_instance; // The one and only instance
17 };
18
19 // Implementation file Singleton.cpp
20 Singleton* Singleton::_instance = 0;
通过将Singleton 的构造函数设为private 可以禁止客户代 直接创建Singleton 对象,除此之外,
Singleton 的copy constructor 和copy assignment operator 都为private 且仅有声明没有实现,
禁止了客户代 拷贝Singleton 对象。唯一可以创建Singleton 对象的是Singleton 自己的静态
成员函数Instance,这样就在编译器保证了Singleton 实例的唯一性。上面这些是在C++中实现
Singleton 模式最基本的要点。
Instance 方法保证只有在第一次调用时才会生成Singleton 对象,以后的调用只是简单返回唯一
的已存在的实例。Instance 方法实际上实现的是懒惰初始化(lazy initialize) 如果程序中根本没
有用到Singleton 对象,也就根本不会产生Singleton 的实例,这在Singleton 对象很少使用且
创建Singleton 对象开销比较大的情况下特别有用。
客户代 现在可以这样使用Singleton :
1 Singleton s = Singleton::Instance();
2 s.DoSomething();
还需要说明的是Singleton 的析构函数,析构函数也为private 可以禁止客户写出如下代 。如
果某个客户写出了如下代 ,随后的对Singleton 的访问就会导致为定义行为,因为Singleton
对象已经不存在。
1 Singleton *p = Singleton::Instance();
2 delete p;
2.引入smart pointer
上面的实现算是一个好的实现吗?当然不是,或许连一个正确的实现都算不上。如果你想凑合,
当然没问题,上面的代码大多数情况下可以工作的很好。也许你已经注意到了一
原创力文档


文档评论(0)