C++实现单件的初探_第1页
C++实现单件的初探_第2页
C++实现单件的初探_第3页
C++实现单件的初探_第4页
C++实现单件的初探_第5页
已阅读5页,还剩8页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前言本文介绍一个比较完善的SINGLETON模式,用C语言编写完成。本文出处已不可考,我只是在我的项目里做了测试,运行良好。安琪2006320入库BLESSEDNESS4YOUHOTMAILCOM目录本文的主要内容为1、SINGLETON模式的基类2、基本的SINGLETON容器3、SINGLETON模板4、引入线程保护代码5、完整的代码6、如何使用SINGLETON模式的基类1、SINGLETON模式的基类首先需要统一SINGLETON类家族的风格,我们用宏定义全权实现构造函数、析构函数和静态的GETINSTANCE函数。但每一个SINGLETON也许有其自己的个性,在构造和析构的时候,可能会有额外的操作,我们将其延伸至以下两个纯虚函数中来,由每个SINGLETON类自己去完成。CLASSSINGLEPATTERNPROTECTEDVIRTUALVOIDINITIALINSTANCE0VIRTUALVOIDDISPOSEINSTANCE0基本的SINGLETON容器2、基本的SINGLETON容器我们使用AUTO_PTR来管理指针,使之在程序结束时会正确的得到析构。以下为基本的一个SINGLETON容器,其所容指针即为自己的一个实例。CLASSSINGLETONFRIENDCLASSAUTO_PTRPROTECTEDSTATICAUTO_PTRM_INSTANCEPROTECTED_FASTCALLSINGLETONVIRTUALSINGLETONPUBLICSTATICSINGLETON_FASTCALLGETINSTANCEIFM_INSTANCEGETNULLM_INSTANCERESETNEWSINGLETONRETURNM_INSTANCEGETAUTO_PTRSINGLETONM_INSTANCESINGLETON模板3、SINGLETON模板如果我们对每一个SINGLETON类都向上面所写那样,我们需要做很多重复工作。现在我们使用模板类来包装一下。我们只需要将上面的代码,用AUTO_PTR管理的指针改成模板代码即可,程序代码如下TEMPLATECLASSSINGLETONFRIENDCLASSAUTO_PTRPROTECTEDSTATICAUTO_PTRM_INSTANCEPROTECTED_FASTCALLSINGLETONVIRTUALSINGLETONPUBLICSTATICT_FASTCALLGETINSTANCEIFM_INSTANCEGETNULLM_INSTANCERESETNEWTRETURNM_INSTANCEGETTEMPLATEAUTO_PTRSINGLETONM_INSTANCE实际上你可以看见,如果编写SINGLETON即变成了基本的SINGLETON。引入线程保护代码4、引入线程保护代码上面的代码在单线程中可以很好的工作,但在多线程环境中,会产生实例被析构再构造的假SINGLETON类。这里我只引入一个简单的线程保护代码做个示例CLASSCRESGUARDPUBLICCRESGUARDM_LGRDCNT0INITIALIZECRITICALSECTIONCRESGUARDDELETECRITICALSECTION/ISGUARDEDISUSEDFORDEBUGGINGBOOLISGUARDEDCONSTRETURNM_LGRDCNT0PUBLICCLASSCGUARDPUBLICCGUARDCRESGUARDCGUARDM_RGUNGUARDPROTECTEDCRESGUARDPRIVATEVOIDGUARDENTERCRITICALSECTIONM_LGRDCNTVOIDUNGUARDM_LGRDCNTLEAVECRITICALSECTION/GUARD/UNGUARDCANONLYBEACCESSEDBYTHENESTEDCGUARDCLASSFRIENDCLASSCRESGUARDCGUARDPRIVATECRITICAL_SECTIONM_CSLONGM_LGRDCNT/OFENTERCRITICALSECTIONCALLS完整的代码5、完整的代码以下是完整的代码,在CBUILDER6,WINDOWSXP编译通过。PRAGMAONCEINCLUDEINCLUDE/线程安全使用的头文件IFNDEFSINGLETONHDEFINESINGLETONHUSINGNAMESPACESTD/BASESINGLEPATTERNCLASSCLASSSINGLEPATTERNPROTECTEDVIRTUALVOIDINITIALINSTANCE0VIRTUALVOIDDISPOSEINSTANCE0/THREADSAFECLASSCLASSCRESGUARDPUBLICCRESGUARDM_LGRDCNT0INITIALIZECRITICALSECTIONCRESGUARDDELETECRITICALSECTION/ISGUARDEDISUSEDFORDEBUGGINGBOOLISGUARDEDCONSTRETURNM_LGRDCNT0PUBLICCLASSCGUARDPUBLICCGUARDCRESGUARDCGUARDM_RGUNGUARDPROTECTEDCRESGUARDPRIVATEVOIDGUARDENTERCRITICALSECTIONM_LGRDCNTVOIDUNGUARDM_LGRDCNTLEAVECRITICALSECTION/GUARD/UNGUARDCANONLYBEACCESSEDBYTHENESTEDCGUARDCLASSFRIENDCLASSCRESGUARDCGUARDPRIVATECRITICAL_SECTIONM_CSLONGM_LGRDCNT/OFENTERCRITICALSECTIONCALLS/SINGLETONCONTAINERTEMPLATECLASSSINGLETONFRIENDCLASSAUTO_PTRPROTECTEDSTATICAUTO_PTRM_INSTANCESTATICCRESGUARD_RSPROTECTED_FASTCALLSINGLETONVIRTUALSINGLETONPUBLICSTATICT_FASTCALLGETINSTANCECRESGUARDCGUARDGD_RSIFM_INSTANCEGETNULLM_INSTANCERESETNEWTRETURNM_INSTANCEGETTEMPLATECRESGUARDSINGLETON_RSTEMPLATEAUTO_PTRSINGLETONM_INSTANCE/MACROOFSINGLETONPATTERNTOUSEDEFINEDECLARE_SINGLETONTYPEFRIENDCLASSAUTO_PTRFRIENDCLASSSINGLETONPUBLICSTATICTYPEGETINSTANCERETURNSINGLETONGETINSTANCEPROTECTED_FASTCALLTYPEINITIALINSTANCEPUBLICVIRTUALTYPEDISPOSEINSTANCEENDIF如何使用6、如何使用在你自己需要实现SINGLETON模式的类,使用宏定义,并实现两个纯虚函数,即可。以下为一个使用示例CLASSMYSINGLEPUBLICSINGLEPATTERNDECLARE_SINGLETONMYSINGLEPROTECTEDVIRTUALVOIDINITIALINSTANCEVIRTUALVOIDDISPOSEINSTANCEPUBLICVOIDRUNINTMAININTARGC,CHARARGVMYSINGLEGETINSTANCERUNRETURN0CLASSAPUBLICSTATICAGETSINGLETONSTATICBOOLINITEDFALSEIFINITEDANEWAINITEDTRUERETURNASTATICVOIDRELEASEIFNULLADELETEAANULLPRIVATESTATICAAAAC实现单件的初探在设计模式中有一个叫做单件SIGLETON的模式,是用来控制创建唯一对象。书中只讲到了如何建立SINGLETON对象,对于如何来销毁此对象则只字不提。但是对象生命的管理对于C程序员来说是多么的重要呀。或许SINGLETON只是属于创建模式的一种,大师们认为在这里不应涉及到“销毁模式”。有人认为SINLETON是应该在程序的退出的时候销毁的。但是退出应该是在什么时候呢。请看如下代码假设是按设计模式里的方式来写一个对象SINGLTON对象。CLASSSINGLTONPRIVATESTATICSINGLTON_INSATNCESINGLTONCOUT“DOSOMETHING/程序体/INTMAIN/VOID程序体/FOO1/IFSINGLTON_INSATNCE/SINGLTONGETSINGLTON不能编译DELETESINGLTONGETSINGLTON事实上如果在SINGLTON某次运行根本就没有调用过FOO1而只是调用了FOO0,但是还必须得在最后程序退出时调用实际上这时候调用GETSINGLTON来建立对象马上就被删除了。这是完全没有必要也是浪费的。想在程序执行时使用判断语句也是行不通的。这样的实现还是可以改进的,使用在SINGLTON中再增加一个静态的成员函数CHECKEXISTINSTANCE来判断对象是否存在,可以提高效率。但这样又给对象增加了接口,增加了代码维护的开销。但是对象在程序结束时你并不清楚是不是真的不再需要此对象了。我们再修改代码如下。CLASSSINGLTONPRIVATESTATICSINGLTON_INSATNCESINGLTONCOUT“DOSOMETHING/程序体/CLASSTESTSINGLETONPUBLICTESTSINGLETONSINGLTONGETSINGLTONDOSOMETHINGTESTSINGLETONSINGLTONGETSINGLTONDOSOMETHING/此处出现内存泄露TESTSINGLETON_TESTINTMAIN/VOID程序体/FOO1DELETESINGLTONGETSINGLTON且看TESTSINGLETON申请出来的对象应该由谁来释放呢。由此引发了有人主张使用引用记数器由模仿COM的RELEASE来实现实现代码如下CLASSSINGLETONPRIVATESTATICINTM_REFSTATICSINGLETON_INSTANCEPUBLICVOIDDOSOMETHINGCOUT“DOSOMETHINGPRELEASEINT_TMAININTARGC,TCHARARGV,TCHARENVPSINGLETONPSINGLETONGETSINGLTONPDOSOMETHINGPRELEASEFOORETURN0这样的方式是不存在内存泄露的,并且这段代码表面上是个单件;实际上,SINGLETON对象是被多次建立和销毁的,如果这个对象不像以上代码写得那么简单,是如果在单件中申请了不小的内存,那么以上的代码是多么的不可想象呀更有如果单件里记录了像使用次数那样的状态变量,那情况就更糟糕了。事实上单件的实现并不比想像中的那样难。我们且看CLASSSINGLTONPRIVATESINGLTONCOUT“ENDLSTATICSINGLTONRETURNSVOIDDOSOMETHINGCOUT“OBJECTIS“THIS“DOSOMETHING“ENDLVOIDFOOINTI/程序体/IFISINGLTONGETSINGLTONDOSOMETHING/程序体/CLASSTE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论