Singleton pattern in D
Daniel Keep
daniel.keep.lists at gmail.com
Fri May 11 09:23:47 PDT 2007
I made a singleton implementation a while ago, although I'd have to say
it was *very likely* overkill (I do that).
Basically, it was a part of my class registry stuff. Long story short,
you did this:
> interface MyInterface
> {
> void foo();
> }
>
> class MyClass : MyInterface
> {
> void foo() { writefln("bar"); }
> }
>
> static this()
> {
> classreg.registerSingleton({return new MyClass;});
> }
Then, in your code, you would get an instance like so:
> classreg.getInstance!(MyInterface);
Which would always return the same instance.
Again, it's probably overkill for what you want. If you want to make
singleton a little easier to use, maybe a mixin would help:
> template Singleton()
> {
> private this()
> in
> {
> assert( instance is null );
> }
> body
> {
> // Put your initialisation stuff in init_singleton.
> static if( is( typeof(this.init_singleton) ) )
> this.init_singleton;
> }
>
> private static typeof(this) instance;
>
> public static typeof(this) getInstance()
> {
> if( instance is null )
> instance = new typeof(this);
> return instance;
> }
> }
>
> class SingletonClass
> {
> mixin Singleton;
> }
Note: not tested, but something along those lines should do you.
Final point: just make sure you actually need singleton. I've seen a
lot of people using singleton for a single class, which would be more
efficiently handled by a static class.
-- Daniel
--
int getRandomNumber()
{
return 4; // chosen by fair dice roll.
// guaranteed to be random.
}
http://xkcd.com/
v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D
i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/
More information about the Digitalmars-d-learn
mailing list