This is the first item in my series “Oxygene by Example”, this time about singletons.

Singleton classes are used when there’s only ever one instance of a class needed. They differ from Static Classes in that they have an actual instance, can implement an interface and you can use them as parameters to a method. There are different ways of writing singletons, but the easiest way is by using a readonly class variable:

type IObjectCache =interfacemethod GetOrCreate(aName: string; aNeedNewValue: Func): T;end; GlobalObjectCache =class(IObjectCache)private fCache: Dictionary :=new Dictionary;   constructor;empty;// required to be private; so nobody can instantiate itpublicclassproperty Instance: MySingleton :=new MyObjectCache;readonly;   method GetOrCreate(aName: string; aNeedNewValue: Func): T;end;   method GlobalObjectCache.GetOrCreate(aName: string; aNeedNewValue: Func): T;beginlocking fCache dobeginvar lValue: Object;if fCache.TryGetValue(aName,out lValue)thenexit T(lValue);result:= aNeedNewValue(); fCache.Add(aName,result);end;end;
Using the singleton is simple, GlobalObjectCache.Instance gives access to all instance members of the class:
lblSystemName.Text:= GlobalObjectCache.Instance.GetOrCreate('ComputerName',-> Environment.MachineName);
The latest version of this article can be found [Here](