|
先看一下源代码。- template <class TYPE, class ACE_LOCK>
- class ACE_Singleton : public ACE_Cleanup
- {
- public:
- /// Global access point to the Singleton.
- static TYPE *instance (void);
- /// Cleanup method, used by <ace_cleanup_destroyer> to destroy the
- /// ACE_Singleton.
- virtual void cleanup (void *param = 0);
- /// Dump the state of the object.
- static void dump (void);
- protected:
- /// Default constructor.
- ACE_Singleton (void);
- /// Contained instance.
- TYPE instance_;
- #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
- /// Pointer to the Singleton (ACE_Cleanup) instance.
- static ACE_Singleton<TYPE, ACE_LOCK> *singleton_;
- #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
- /// Get pointer to the Singleton instance.
- static ACE_Singleton<TYPE, ACE_LOCK> *&instance_i (void);
- };
复制代码 实现文件:- // Singleton.cpp,v 4.54 2005/10/28 16:14:55 ossama Exp
- #ifndef ACE_SINGLETON_CPP
- #define ACE_SINGLETON_CPP
- #include "ace/Singleton.h"
- #if !defined (ACE_LACKS_PRAGMA_ONCE)
- # pragma once
- #endif /* ACE_LACKS_PRAGMA_ONCE */
- #if !defined (__ACE_INLINE__)
- #include "ace/Singleton.inl"
- #endif /* __ACE_INLINE__ */
- #include "ace/Object_Manager.h"
- #include "ace/Log_Msg.h"
- #include "ace/Framework_Component.h"
- #include "ace/Guard_T.h"
- ACE_RCSID (ace,
- Singleton,
- "Singleton.cpp,v 4.54 2005/10/28 16:14:55 ossama Exp")
- ACE_BEGIN_VERSIONED_NAMESPACE_DECL
- template <class TYPE, class ACE_LOCK> void
- ACE_Singleton<TYPE, ACE_LOCK>::dump (void)
- {
- #if defined (ACE_HAS_DUMP)
- ACE_TRACE ("ACE_Singleton<TYPE, ACE_LOCK>::dump");
- #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
- ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("instance_ = %x"),
- ACE_Singleton<TYPE, ACE_LOCK>::instance_i ()));
- ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
- #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
- #endif /* ACE_HAS_DUMP */
- }
- template <class TYPE, class ACE_LOCK> ACE_Singleton<TYPE, ACE_LOCK> *&
- ACE_Singleton<TYPE, ACE_LOCK>::instance_i (void)
- {
- #if defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
- // Pointer to the Singleton instance. This works around a bug with
- // G++ and it's (mis-)handling of templates and statics...
- static ACE_Singleton<TYPE, ACE_LOCK> *singleton_ = 0;
- return singleton_;
- #else
- return ACE_Singleton<TYPE, ACE_LOCK>::singleton_;
- #endif /* ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES */
- }
- template <class TYPE, class ACE_LOCK> TYPE *
- ACE_Singleton<TYPE, ACE_LOCK>::instance (void)
- {
- ACE_TRACE ("ACE_Singleton<TYPE, ACE_LOCK>::instance");
- ACE_Singleton<TYPE, ACE_LOCK> *&singleton =
- ACE_Singleton<TYPE, ACE_LOCK>::instance_i ();
- // Perform the Double-Check pattern...
- if (singleton == 0)
- {
- if (ACE_Object_Manager::starting_up () ||
- ACE_Object_Manager::shutting_down ())
- {
- // The program is still starting up, and therefore assumed
- // to be single threaded. There's no need to double-check.
- // Or, the ACE_Object_Manager instance has been destroyed,
- // so the preallocated lock is not available. Either way,
- // don't register for destruction with the
- // ACE_Object_Manager: we'll have to leak this instance.
- ACE_NEW_RETURN (singleton, (ACE_Singleton<TYPE, ACE_LOCK>), 0);
- }
- else
- {
- #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
- // Obtain a lock from the ACE_Object_Manager. The pointer
- // is static, so we only obtain one per ACE_Singleton
- // instantiation.
- static ACE_LOCK *lock = 0;
- if (ACE_Object_Manager::get_singleton_lock (lock) != 0)
- // Failed to acquire the lock!
- return 0;
- ACE_GUARD_RETURN (ACE_LOCK, ace_mon, *lock, 0);
- if (singleton == 0)
- {
- #endif /* ACE_MT_SAFE */
- ACE_NEW_RETURN (singleton, (ACE_Singleton<TYPE, ACE_LOCK>), 0);
- // Register for destruction with ACE_Object_Manager.
- ACE_Object_Manager::at_exit (singleton);
- #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
- }
- #endif /* ACE_MT_SAFE */
- }
- }
- return &singleton->instance_;
- }
- template <class TYPE, class ACE_LOCK> void
- ACE_Singleton<TYPE, ACE_LOCK>::cleanup (void *)
- {
- delete this;
- ACE_Singleton<TYPE, ACE_LOCK>::instance_i () = 0;
- }
- #if !defined (ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES)
- // Pointer to the Singleton instance.
- template <class TYPE, class ACE_LOCK> ACE_Singleton<TYPE, ACE_LOCK> *
- ACE_Singleton<TYPE, ACE_LOCK>::singleton_ = 0;
-
复制代码 class ACE_Singleton : public ACE_Cleanup 继承了ACE_Cleanup,这个类自动完成了对对象的清理工作。就是实现了
template <class TYPE, class ACE_LOCK> voidACE_Singleton<TYPE, ACE_LOCK>::cleanup (void *){ delete this; ACE_Singleton<TYPE, ACE_LOCK>::instance_i () = 0;}
还有就是对程序的使用了ACE_Object_Manager 释放程序的实例。
ACE_Object_Manager::at_exit (singleton);
因此当你使用ACE_Singleton 大可以放心的使用,对象管理ACE经过自己的方法和类已经很好的解决了。
总之,不管他如何实现,我们完全就是直接简单的使用。
typedef ACE_Singleton<Class, ACE_Null_Mutex> instance;
更多文章,欢迎访问:http://blog.csdn.net/wallwind
|
|