细说Singleton模式1

细说Singleton模式1

ID:43753266

大小:189.00 KB

页数:8页

时间:2019-10-13

细说Singleton模式1_第1页
细说Singleton模式1_第2页
细说Singleton模式1_第3页
细说Singleton模式1_第4页
细说Singleton模式1_第5页
资源描述:

《细说Singleton模式1》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、细说Singleton模式创建、多线程与销毁一GOF着作中对Singleton模式的描述为:保证一个class只有一个实体(Instance),并为它提供一个全局访问点(globalaccesspoint)。从其描述来看,是非常简单的,但实现该模式却是复杂的。Singleton设计模式不存在一种所谓的“最佳”方案。需要根据当时的具体问题进行具体解决,下面将讲述在不同环境下的解决方案。Singleton的详细解释,请大家看GOF的着作《设计模式》一书。俺比较懒,是不想抄了。1.Singleton创建1.1GOFSingleton在GOF着作中对Si

2、ngleton模式的实现方式如下:1./*解一*/2.classSingleton3.{4.public:5.staticSingleton*Instance(){//16.if(!m_pInstatnce)//27.m_pInstance=newSingleton;//38.returnm_pInstance;//49.}10.private:11.staticSingleton*m_pInstatnce;//512.private:13.Singleton();//614.Singleton(constSingleton&);//715.Si

3、ngleton&operator=(constSingleton&);//816.~Singleton();//917.}18.Singleton*Singleton:m_pInstatnce=NULL;//1019.在上面的解决方案中,我们只在需要调用时,才产生一个Singleton的对象。这样带来的好处是,如果该对象产生带来的结果很昂贵,但不经常用到时,是一种非常好的策略。但如果该Instance被频繁调用,那么就有人觉得Instance中的判断降低了效率(虽然只是一个判断语句^_^),那么我们就把第5条语句该为20.staticSingle

4、tonm_Instatnce;如此一来,在Instatnce直接返回&m_Instance,而不用做任何判断,效率也高了。(是不是呢?)这样修改后,我们将带来灾难性的后果:1:首先有可能编译器这关就没法通过,说m_Instance该外部变量无法解决(visuralC++6.0)21.errorLNK2001:unresolvedexternalsymbol"private:staticclassSingletonSingleton::m_Instance"(?m_Instance@Singleton@@0V1@A)2:如果编译器这关通过了就没问题

5、了么?答案是否定的。第一是不管Instance是否用到,该静态变量对象在编译器编译时就产生了,即资源消耗是不可避免的;第二是无法确保编译器一定先将m_Instance初始化。所以Instance的调用有可能传回一个尚没构造的Singleton对象。这也意味着你无法保证任何外部对象所使用的m_Instance是一个被正确初始化的对象。1.2MeyersSingleton我们如何解决这个问题呢,实际上很简单。一种非常优雅的做法由ScottMeyers最先提出,故也称为MeyersSingleton。它依赖编译器的神奇技巧。即函数内的static对象只

6、在该函数第一次执行时才初始化(请注意不是static常量)。22./*解二*/23.classSingleton24.{25.public:26.staticSingleton*Instance(){//127.staticSingletonsInstance;//228.return&sInstance;//329.}30.private:31.Singleton();//432.Singleton(constSingleton&);//533.Singleton&operator=(constSingleton&);//634.~Single

7、ton();//735.}36.解二在Instance中定义了一个Static的Singleton对象,来解决Instance中初始化的问题,也很顺利的解决了定义Static成员对象带来的问题。请注意,解二在VC6中不能编译通过,将有以下的错误:37.errorC2248:'Singleton::~Singleton':cannotaccessprivatememberdeclaredinclass'Singleton'e:workqa.h(81):seedeclarationof'Singleton::~Singleton'产生该问题的错

8、误原因是什么呢(请仔细思考^_^)原因在于在产生staticSingleton对象后,编译器会自动产生一个销毁函数__DestroySi

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。