delphi中的单例模式的疑问??? ( 积分: 63 )

  • 主题发起人 主题发起人 小飞龙
  • 开始时间 开始时间

小飞龙

Unregistered / Unconfirmed
GUEST, unregistred user!
单例模式看网上说有3种,最后一种说到登记式单例,java里面用到了hashtable,delphi中并没有这样的东西,请问如何在delphi中建立登记式的单例。因为我需要子类化。
 
实现这个模式delphi没有jave和c++来得方便,变通一下还是可以的
http://delphi.sharpplus.com/Delphi/singleton.htm
 
delphi没有静态变量,做单实例代码要变通一点:
Delphi中的静态属性及静态方法的实现
方法1:
使用过c++的人都知道在c++的类中有静态属性及静态方法,为程序设计带来很多方便.那么在Delphi中静态属性及静态方法是怎么实现的呢?请看下面的实例:

unit Unit2;

interface

type
TMyClass = Class
public
{静态过程:设置静态属性的值}
class procedure SetStaticMemberValue(AString: string);
{静态函数:读取静态属性的值}
class function GetStaticMemberValue: string;
end;

implementation
{在此声明静态属性,这一点与c++有很大的不同}
var
AStaticMember: string;

class function TMyClass.GetStaticMemberValue: string;
begin
Result := AStaticMember;
end;

class procedure TMyClass.SetStaticMemberValue(AString: string);
begin
AStaticMember := AString;
end;

end.

那么在TMyClass中声明的属性及方法是否是静态属性或静态方法呢?请看下面的实例:

...
uses unit2
...

procedure TForm1.Button2Click(Sender: TObject);
begin
{不需声明TMyClass的实例,可直接设置及读取静态属性的值}
TMyClass.SetStaticMemberValue('MyClass');
showmessage(TMyClass.GetStaticMemberValue);
end;


方法2:(老外的就是经典)
project->option->compiler->Assginable Typed constant(打勾,可以修改常量)
说明:
1.重复调用同一函数地址,它申请的变量地址是不变的
2.const类型在函数结束后不会清空
........................................................
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TStaticMemberObject = class
private
class procedure SetName(const Value: string);
class function GetName: string;
class function StaticMethod(ReadFlag: boolean
var Value: string):boolean;
published
property Name: string read GetName write SetName;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TStaticMemberObject }

class function TStaticMemberObject.StaticMethod(ReadFlag: boolean;
var Value: string): boolean;
const static: string = '';
begin
result := True;
if ReadFlag then
Value := static
else
static := value;
end;


class function TStaticMemberObject.GetName: string;
var
Value: string;
begin
StaticMethod(true, Value);
result := Value;
end;

class procedure TStaticMemberObject.SetName(const Value: string);
var
setvalue: string;
begin
setvalue := Value;
StaticMethod(false, setvalue);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
so: TStaticMemberObject;
begin
so.Name := 'Hello, my static property!';
ShowMessage(so.Name);
so.SetName('hi, my static property!');
ShowMessage(so.GetName);
end;

end.
 
实际上就是一个开关
{$WRITEABLECONST ON}
const FInstance: TChild = nil;
{$WRITEABLECONST OFF}
这个我知道,我想知道的是怎么注册!!!
普通的单例我懂
 
HashTable对应Delphi是在Contnrs单元的
TBucketList
TObjectBucketList
TIntegerBucketList
即Hash桶,和Hash表一个意思
 
这几个用不了java的方法
 
多人接受答案了。
 
后退
顶部