unit uSingleton;
interface
uses SysUtils;
type ESingletonException = class(Exception);
TSingleton = class private // 单例类真正使用的构造函数,此处命名为CreateNew constructor CreateNew; public // 用于阻止显式调用,因为即便将其设为私有的, // 也可以调用构造函数Create, // 虽然实际上调用的是其父类的构造函数, // 这样显然不是很理想, // 所以只好声明并在实现中引发 ESingletonException constructor Create; // 类方法,返回对唯一的实例 class function Instance: TSingleton; end;
implementation
uses SyncObjs;
var SingletonInstance: TSingleton = nil;
// 用于锁定 TSingleton.Instance 方法,防止多线程访问 SingletonLocker: TCriticalSection = nil;
{ TSingleton }
constructor TSingleton.Create; begin raise ESingletonException.Create('单例类,禁止显式调用构造函数'); end;
constructor TSingleton.CreateNew; begin // do something end;
class function TSingleton.Instance: TSingleton; begin SingletonLocker.Enter; try if not Assigned(SingletonInstance) then SingletonInstance := TSingleton.CreateNew; Result := SingletonInstance; finally SingletonLocker.Leave; end; end;
initialization SingletonLocker := TCriticalSection.Create; finalization SingletonLocker.Free; end.

|