閱讀993 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Delphi中類似C中static變量的實現

編程模式單例模式中強調一個程序中隻有一個類的實例。

C++中用類的static成員和static方法實現。

用Delphi中沒有static關鍵字,用全局變量保存實例不是好的實現方式。Delphi中有類方法可直接調用。在類方法中使用const實現類似C的static成員。

TSingle = class(TObject)
private
protected
constructor CreateInstance;
class funtion GetInstance(Request: integer): TSingle;
public
constructor Create;
destructor Destroy; override;
class procedure ReleaseInstance;
class function SingleInstance: TSingle;
end;

implementation

constructor TSingle.Create;
begin
inherited Create;
raise Exception.CreateFmt('隻能通過SingleInstance方法來創建和訪問%s的實例!', [ClassName]);
end;

constructor TSingle.CreateInstance;
begin
inherited Create;
end;

destructor TSingle.Destroy;
begin
if GetInstance(0) = self then GetInstance(2);
inherited Destroy;
end;

class function TSingle.GetInstance(Request: integer): TSingle;
const FInstance: TSingle = nil;
begin
{
Request = 0 : 不做任何處理,供釋放時使用
Request = 1 : 存在該類實例時使用該實例,不存在時創建之
Request = 2 :返回一個空指針,用於重置實例
}
case Request of
0: ;
1: if not Assigned(FInstance) then FInstance := CreateInstance;
2: FInstance := nil;
else
raise Exception.CreateFmt('%d是GetInstance()的非法參數調用', [Request]);
end;
result := FInstance;
end;

class procedure TSingle.ReleaseInstance;
begin
GetInstance(0).Free;
end;

Class function TSingle.SingleInstance: TSingle;
begin
result := GetInstance(1);
end;

最後更新:2017-04-26 21:31:01

  上一篇:go fastreport腳本函數實 現金額大小寫轉換
  下一篇:go fastreport添加自定義變量Exception標識符未宣告