import std.stdio; //============================================================================== /* This implementation of the Singleton pattern instantiates the object the first time the instance method is called. This is the implementation described by the Gang of Four. */ //============================================================================== class MySingleton { public: static MySingleton instance() { if(_instance is null) _instance = new MySingleton; return _instance; } char[] toString() { return "Hello MySingleton"; } private: this() {} static MySingleton _instance; } //============================================================================== /* This is a templated version of MySingleton. */ //============================================================================== class Singleton(T) { public: static T instance() { if(_instance is null) _instance = new T; return _instance; } private: this() {} static T _instance; } class TMySingleton : Singleton!(TMySingleton) { public: char[] toString() { return "Hello TMySingleton"; } } //============================================================================== /* This implementation of the Singleton pattern instantiates the object automatically during program startup, when D runs static class and module constructors. */ //============================================================================== class MySingleton2 { public: static MySingleton2 instance() { return _instance; } char[] toString() { return "Hello MySingleton2"; } private: this() {} static this() { _instance = new MySingleton2; } static const MySingleton2 _instance; } //============================================================================== /* This is a templated version of MySingleton2. */ //============================================================================== class Singleton2(T) { public: static T instance() { return _instance; } private: this() {} static this() { _instance = new T; } static const T _instance; } class TMySingleton2 : Singleton!(TMySingleton2) { public: char[] toString() { return "Hello TMySingleton2"; } } //============================================================================== void main() { writefln(MySingleton.instance.toString()); writefln(TMySingleton.instance.toString()); writefln(MySingleton2.instance.toString()); writefln(TMySingleton2.instance.toString()); }