虽然我把Construtor声明成private,但是还是可以Create.不会在编译时报错,我希望只能有一个实例.TSinglon = class()
private
Construtor Create();
end.var
Singlon : TSinglon;但是还是可以Singlon := TSinglon.Create();, 其实他调用的是TObject的Create方法, 在运行期才会报错, 难道就没有方法覆盖父类的construtor函数么?
private
Construtor Create();
end.var
Singlon : TSinglon;但是还是可以Singlon := TSinglon.Create();, 其实他调用的是TObject的Create方法, 在运行期才会报错, 难道就没有方法覆盖父类的construtor函数么?
public
Construtor Create();override;
end.
关于singlon模式,Delphi中最好用override NewInstance类函数来实现的.来自:Traveller, 时间:2004-7-19 16:55:54, ID:2719562
薄荷兄真是一句话点醒梦中人啊!受教受教!
请看我的实现,这种方式下,用户无论何时调用Create返回的都是同一个指针而不会真的创建新的对象:type
TTestObj = class(TObject)
private
FTestData: string;
public
class function NewInstance: TObject; override;
procedure FreeInstance; override;
property TestData: string read FTestData write FTestData;
end;{ TTestObj }var
mInst: TTestObj;
mInstRef: Integer;procedure TTestObj.FreeInstance;
begin
Dec(mInstRef);
if mInstRef = 0 then
inherited;
end;class function TTestObj.NewInstance: TObject;
begin
if not Assigned(mInst) then
mInst := Inherited NewInstance as TTestObj;
Inc(mInstRef);
Result := mInst;
end;{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
var
a: TTestObj;
begin
a := TTestObj.Create;
a.TestData := 'abc';
FreeAndNil(a);
end;procedure TForm1.btn2Click(Sender: TObject);
var
a: TTestObj;
begin
a := TTestObj.Create;
ShowMessage(a.TestData);
FreeAndNil(a);
end;initialization
mInst := TTestObj.Create;
finalization
FreeAndNil(mInst);
end.参见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2515036
ysai的方法不错,但我怕哪里谁又Create出来一堆, 如果能隐藏起来, 免得找错误时麻烦.-----------------------------------------------------------------
就是这个方法,你自己测试一下就知道了......