• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Singleton的C++实现及相关问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
编程序的时候很多情况下要求当前的程序中只有一个object。例如一个程序只有一个和数据库的连接,只有一个鼠标的object。

  最简单的方法是用个全局变量或者用个静态变量。但这违反基本的Object Oriented Design 的原则,使程序执行的整体结构,可读性以及可维护大大下降。同时如果所编写的程序不是主程序而是dll的话全局变量的寿命更难控制。

  Design Pattern 中最简单也是应用最广的就是Singleton, 就是用于解决这个问题的。下面是一个简单的Singleton的C++的实现,应用这个class之后可以保证当前程序中只有一个copy 。
Class Singleton { public: static Singleton * GetInstance() { static Singleton instance; return &instance; } protected: Singleton(); ~Singleton(); }
  由于constructor和destructor都是protected,所以无法直接生成这个class。使用时直接用 Singleton::GetInsgtance()就行了。不必操心Singleton的寿命。

  另一种实现方法如下:
Class Singleton { public: static Singleton * GetInstance() { if(!m_pInstance) m_pInstance = new Singleton(); return pinstance; } private: static Singleton *m_pInstance; protected: Singleton(); ~Singleton(); }
  这种写法的问题在于你需要在new 之后的适当时候delete 掉这个Instance。这个寿命很难控制。但有的人说这个实现是thread_safe的。
而第一个不是thread_safe 。

  我瞧了N天也没有发现这个实现怎么thread safe。经多家讨论后证明这个实现合第一个一样不thread safe。两个进程同时进入GetInstance同时m_pInstance还是NULL,同时constructor花的时间特别长的时候就可能出事。要将其用在多进程的程序中的时候最好在GetInstance函数的开始和结束加上“Cretical Section”。

  当我学完这一段的时候发现他竟然不能用在我的project里,因为我的project里要管理的这个object可能有几个copy(数量确定)。那么就需要把上面的概念稍微扩展一下。把static Singleton instance换成数组或者vector。这样能够生成的数量是确定的。使用者不会因为多用几次GetInstance而改变了内存的管理。当然用户用 GetInstance()的时候应该知道自己要Get哪个copy,给GetInstance()加个参数。稍微复杂一点。

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C++泛型基础发布时间:2022-07-13
下一篇:
c#实现QQ群成员列表导出及邮件群发之邮件群发发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap