织梦CMS - 轻松建站从此开始!

罗索

Singleton all in one

jackyhwei 发布于 2011-05-19 09:40 点击:次 
这保证了不被非法创建,当然,个人觉得,这不是单件的必然要求,只是为了保证单件安全性。如果你认为一个方法是私有的,那你不要在外部使用它就是了,某些一样很优雅的语言也使用这个约定来保护私有数据,当然,这是着力于小规模项目的语言的策略。
TAG:

1.将default构造函数声明为私有的的。 
这保证了不被非法创建,当然,个人觉得,这不是单件的必然要求,只是为了保证单件安全性。如果你认为一个方法是私有的,那你不要在外部使用它就是了,某些一样很优雅的语言也使用这个约定来保护私有数据,当然,这是着力于小规模项目的语言的策略。

2.将copy构造函数定义为私有的。
这是容易忽视的一点,如果你不定义copy构造函数,编译器会帮你定义一个,自己声明一个私有的可以回绝编译器这个友好的帮助。

3.让instance回传引用。
如果回传指针,调用者可能有意无意的删除它,这是我们不希望看到的,回传引用可以避免这个问题。

4.atexit函数。
atexit是C提供的一个非常有用的函数,在程序结束的时候,通过atexit注册的方法可以被调用,而且调用依 照atexit注册的FIFO顺序进行,只不过,在atexit注册的函数中再次注册atexit会出现不可预知的问题,据说C++标准已经着手修改了此 事。但是,请对此保有一份警惕,因为你不知道你的编译器会干什么。

5.placement new在特定地址上构造新的对象的技术的思考。
关于placement new和构造对象的双重思考。

6.dead reference。
当referenced对象被析构后,如果继续调用reference,那还是会得到原先referenced对象所在的内存,只不过,那块内存上已物是人非。

7.policy的正交分解
正交分解的重要性已经提及,对于singleton而言,构造方式、销毁方式和线程安全是三个互不影响的方面,所以如此处理了singleton

  1. template    < 
  2.     class    T, 
  3.     template <class>    class CreationPolicy    = CreateUsingNew, 
  4.     template <class>    class LifetimePolicy    = DefaultLifetime, 
  5.     template <class>    class ThreadingModel    = SingleThread 
  6. class    SingletonHolder; 

8.删除策略中的SetLongevity方法
SetLongevity每次都调用一次atexit,但是每次其实都是注册的同一个方法, 这样只是保证多少次set就有多少次atexit-delete,并不保证顺序,可是在atext注册的方法被调用的时候,它进行了顺序删除,这也是 SetLongevity的实现的技巧了。可以看到,这个策略只对new出来的对象有意义。而且,为了避免对象内存哪个最后删除的问题,使用 realloc处理。

(win2ks)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201105/12023.html]
本文出处:CSDN博客 作者:win2ks
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容