- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
细说Singleton模式1.ppt
细说Singleton模式 创建、多线程与销毁 一 GOF着作中对Singleton模式的描述为:保证一个class只有一个实体(Instance),并为它提供一个全局访问点(global access point)。 从其描述来看,是非常简单的,但实现该模式却是复杂的。Singleton设计模式不存在一种所谓的“最佳”方案。需要根据当时的具体问题进行具体解决,下面将讲述在不同环境下的解决方案。 Singleton的详细解释,请大家看GOF的着作《设计模式》一书。俺比较懒,是不想抄了。 1.Singleton创建 1.1 GOF Singleton 在GOF着作中对Singleton模式的实现方式如下: 1./*解一*/ 2.class Singleton 3.{ 4.public: 5.static Singleton *Instance(){ //1 6.if( !m_pInstatnce) //2 7.m_pInstance = new Singleton;//3 8.return m_pInstance; //4 9.} 10.private: 11.static Singleton *m_pInstatnce; //5 12.private: 13.Singleton(); //6 14.Singleton(const Singleton); //7 15.Singleton operator=(const Singleton); //8 16.~Singleton(); //9 17.} 18.Singleton *Singleton:m_pInstatnce = NULL; //10 19. 在上面的解决方案中,我们只在需要调用时,才产生一个Singleton的对象。这样带来的好处是,如果该对象产生带来的结果很昂贵,但不经常用到时,是一种非常好的策略。但如果该Instance被频繁调用,那么就有人觉得Instance中的判断降低了效率(虽然只是一个判断语句^_^),那么我们就把第5条语句该为 20.static Singleton m_Instatnce; 如此一来,在Instatnce直接返回m_Instance,而不用做任何判断,效率也高了。(是不是呢?) 这样修改后,我们将带来灾难性的后果: 1:首先有可能编译器这关就没法通过,说m_Instance该外部变量无法解决(visural C++6.0) 21.error LNK2001: unresolved external symbol private: static class Singleton Singleton::m_Instance (?m_Instance@Singleton@@0V1@A) 2:如果编译器这关通过了就没问题了么?答案是否定的。 第一是不管Instance是否用到,该静态变量对象在编译器编译时就产生了,即资源消耗是不可避免的; 第二是无法确保编译器一定先将m_Instance初始化。所以Instance的调用有可能传回一个尚没构造的Singleton对象。这也意味着你无法保证任何外部对象所使用的m_Instance是一个被正确初始化的对象。 1.2 Meyers Singleton 我们如何解决这个问题呢,实际上很简单。一种非常优雅的做法由Scott Meyers最先提出,故也称为Meyers Singleton。它依赖编译器的神奇技巧。即函数内的static对象只在该函数第一次执行时才初始化(请注意不是static常量)。 22./*解二*/ 23.class Singleton 24.{ 25.public: 26.static Singleton *Instance(){ //1 27.static Singleton sInstance; //2 28.return sInstance; //3 29.} 30.private: 31.Sing
文档评论(0)