Singleton in Action?

Eugene Wissner belka at caraus.de
Sat Feb 2 17:34:11 UTC 2019


On Saturday, 2 February 2019 at 16:56:45 UTC, Ron Tarrant wrote:
> Hi guys,
>
> I ran into another snag this morning while trying to implement 
> a singleton. I found all kinds of examples of singleton 
> definitions, but nothing about how to put them into practice.
>
> Can someone show me a code example for how one would actually 
> use a singleton pattern in D? When I did the same thing in PHP, 
> it took me forever to wrap my brain around it, so I'm hoping to 
> get there a little faster this time.
>
> Here's the singleton code I've been playing with:
>
> class DSingleton
> {
> 	private:
> 	// Cache instantiation flag in thread-local bool
> 	// Thread local
> 	static bool instantiated_;
>
> 	// Thread global
> 	__gshared DSingleton instance_;
>
> 	this()
> 	{
> 		
> 	} // this()
>
> 	public:
> 	
> 	static DSingleton get()
> 	{
> 		if(!instantiated_)
> 		{
> 			synchronized(DSingleton.classinfo)
> 			{
> 				if(!instance_)
> 				{
> 					instance_ = new DSingleton();
> 					writeln("creating");
> 				}
>
> 				instantiated_ = true;
> 			}
> 		}
> 		else
> 		{
> 			writeln("not created");
> 		}
>
> 		return(instance_);
> 		
> 	} // DSingleton()
>
> } // class DSingleton
>
> So, my big question is, do I instantiate like this:
>
> DSingleton singleton = new DSingleton;
>
> Or like this:
>
> DSingleton singleton = singleton.get();
>
> And subsequent calls would be...? The same? Using get() only?

Imho it looks fine.

For creation get() should be always used, since it is the most 
convenient way to ensure that there is really only one instance 
of the singleton. Just make this() private, so only you can 
create new instances:

private this()
{
}

And you probably don't need instantiated_, you can always check 
whether instance_ is null or not. So:

if (instance_ is null)
{
     ...
}
else
{
    ...
}


More information about the Digitalmars-d-learn mailing list