Singleton implementation

Zack Rusin zack at kde.org
Wed Jul 9 06:11:40 BST 2003


Hi,

I had this on the drive for quite a while - it's a singleton 
implementation heavily based on the one from "Modern C++ Design". 
Someone reminded me of it and I decided to see what people think about 
it. 
For those who haven't read "Modern C++ Design" - the singleton 
implementation from that book is template-policy based. Meaning 
template classes define its behavior. The basic class is the 
KDE::SingletonHolder. It's a three argument template class with the 
following arguments : 
template
    <
        typename T,
        template <class> class CreationPolicy = CreateUsingNew,
        template <class> class LifetimePolicy = DefaultLifetime
    >
    class SingletonHolder { ... };

The typename T is, of course, the class which one wants to use as a 
singleton. The CreationPolicy is a way in which one wants to 
create/destroy the singleton. Currently there are three policies (and I 
don't think we can have more of those) :
- CreateUsingNew - creates/destroys with the new/delete pair,
- CreateUsingMalloc - malloc/free respectively,
- CreateStatic - creates the object in static memory.
LifetimePolicy defines how/when should the singleton be destructed. 
There are four policies for those:
-  DefaultLifetime - simply schedules the CreationPolicy destruction 
with the std::atexit function,
- KDEDefaultLifetime - similar to DefaultLifetime but uses 
KStaticDeleterBase & KGlobal functions dealing with KStaticDeleterBase 
to perform destruction,
- PhoenixSingleton - like DefaultLifetime but allows recreation of a 
destructed singleton and its another destruction (useful when a 
singleton on which a few others singletons depends on is deleted before 
those singletons),
- SingletonWithLongevity - it's a nice implementation of that policy 
that lets the user decide in which order the singletons using this 
policy will be deleted.
So, how does one use all that  to get a singleton?
You write your class just like it would be a normal class. Then in your 
header you add:
#include <ksingleton.h>
typedef KDE::SingletonHolder< YourClass > YourClassSingle;
Now YourClassSingle::Instance() returns a pointer to the singleton of 
YourClass, so you use it like :
YourClassSingle::Instance()->someFunc();
And that's it, you have a complete implementation of a singleton for 
your class.

The implementation with a sample test is here :
http://www.cse.psu.edu/~mrusin/single.tar.bz2
Comments?

Zack

-- 
"Daddy, what does "C: Format Complete" mean? "
"It means you're dead"




More information about the kde-core-devel mailing list