德尔福Singleton模式

前端之家收集整理的这篇文章主要介绍了德尔福Singleton模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我知道这是社区多次讨论的,但是我在Delphi中找不到一个简单的单例模式的实现。
我在C#中有一个例子:
public sealed class Singleton {
  // Private Constructor
  Singleton( ) { }

  // Private object instantiated with private constructor
  static readonly Singleton instance = new Singleton( );

  // Public static property to get the object
  public static Singleton UniqueInstance {
    get { return instance;}
}

我知道在Delphi中没有这样优雅的解决方案,我看到很多关于无法正确隐藏Delphi中的构造函数(使其为私有)的讨论,所以我们需要覆盖NewInstance和FreeInstrance方法。我相信这是我在http://ibeblog.com/?p=65发现的一些实现:

type
TTestClass = class
private
  class var FInstance: TTestClass;
public                              
  class function GetInstance: TTestClass;
  class destructor DestroyClass;
end;

{ TTestClass }
class destructor TTestClass.DestroyClass;
begin
  if Assigned(FInstance) then
  FInstance.Free;
end;

class function TTestClass.GetInstance: TTestClass;
begin
  if not Assigned(FInstance) then
  FInstance := TTestClass.Create;
  Result := FInstance;
end;

你对Singleton模式的建议是什么?可以简单优雅,线程安全吗?

谢谢。

解决方法

我想如果我想要一个没有任何方法构建的类似对象的东西,我可能会使用与单元实现部分中包含的实现对象的接口。

我将通过一个全局函数(在接口部分声明)来公开接口。该实例将在完成部分中进行整理。

要获得线程安全性,我将使用关键部分(或等效的)或可能仔细实施的双重检查锁定,但认识到天真的实现只能由于x86内存模型的强大性质而起作用。

它看起来像这样:

unit uSingleton;

interface

uses
  SyncObjs;

type
  ISingleton = interface
    procedure DoStuff;
  end;

function Singleton: ISingleton;

implementation

type
  TSingleton = class(TInterfacedObject,ISingleton)
  private
    procedure DoStuff;
  end;

{ TSingleton }

procedure TSingleton.DoStuff;
begin
end;

var
  Lock: TCriticalSection;
  _Singleton: ISingleton;

function Singleton: ISingleton;
begin
  Lock.Acquire;
  Try
    if not Assigned(_Singleton) then
      _Singleton := TSingleton.Create;
    Result := _Singleton;
  Finally
    Lock.Release;
  End;
end;

initialization
  Lock := TCriticalSection.Create;

finalization
  Lock.Free;

end.

猜你在找的Delphi相关文章