设计模式之singleton[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 cfqdream 的 blog

program singletontest;

uses
  forms,
  mainfrm in 'mainfrm.pas' {form1},
  singletonfrm in 'singletonfrm.pas' {form2};

{$r *.res}

begin
  application.initialize;
  application.createform(tform1, form1);
  application.run;
end.


unit singletonfrm;

interface

uses
  windows, messages, sysutils, variants, classes, graphics, controls, forms,
  dialogs, stdctrls;

type
  tform2 = class(tform)
    button1: tbutton;
    button2: tbutton;
    edit1: tedit;
    procedure button1click(sender: tobject);
    procedure formclose(sender: tobject; var action: tcloseaction);
    procedure button2click(sender: tobject);
    procedure formdestroy(sender: tobject);
    procedure formcreate(sender: tobject);
  private
    { private declarations }
  public
    { public declarations }
    selfptr:tform2;
    class function getinstanceptr:integer;
    class function getinstance:tform2;
  end;

var
  form2: tform2;

implementation

{$r *.dfm}
procedure tform2.button1click(sender: tobject);
begin
  hide;
end;

procedure tform2.formclose(sender: tobject; var action: tcloseaction);
begin
  action:=cafree;
end;

procedure tform2.button2click(sender: tobject);
begin
  close;
end;

procedure tform2.formdestroy(sender: tobject);
begin
  selfptr:=nil;
end;

procedure tform2.formcreate(sender: tobject);
begin
  selfptr:=self;
end;

class function tform2.getinstanceptr: integer;
const
  isave:integer=0;
var
  pr:pointer;
  p:^integer;
  form:tform2;
begin
  p:=@isave;
  form:=nil;
  if (isave<>0) then
  begin
    result:=isave;
    form:=pointer(isave);
  end;
  if not assigned(form) then
  begin
    form:=tform2.create(nil);
    p^:=integer(form);
    result:=isave;
  end
  else if not assigned(form.selfptr) then
  begin
    form:=tform2.create(nil);
    p^:=integer(form);
    result:=isave;
  end;
end;

class function tform2.getinstance: tform2;
begin
  result:=pointer(getinstanceptr);
end;

end.

unit mainfrm;

interface

uses
  windows, messages, sysutils, variants, classes, graphics, controls, forms,
  dialogs, stdctrls;

type
  tform1 = class(tform)
    button1: tbutton;
    edit1: tedit;
    button2: tbutton;
    button3: tbutton;
    edit2: tedit;
    button4: tbutton;
    button5: tbutton;
    procedure button2click(sender: tobject);
    procedure button1click(sender: tobject);
    procedure button3click(sender: tobject);
    procedure button4click(sender: tobject);
    procedure button5click(sender: tobject);
  private
    { private declarations }
  public
    { public declarations }
  end;

  tsingleton = class(tobject)
  private
    fusername: string;
    procedure setusername(const value: string);
  published
    destructor destroy;override;
  public
    property username:string read fusername write setusername;
    class function getinstanceptr(value:integer):integer;
    class function getinstance:tsingleton;
  end;

var
  form1: tform1;

implementation

uses singletonfrm;

{$r *.dfm}

procedure tform1.button1click(sender: tobject);
var
  form2:tform2;
begin
  form2:=tform2.getinstance;
  edit1.text:=inttostr(integer(form2));
  form2.show;
end;

procedure tform1.button2click(sender: tobject);
var
  frm2:tform2;
begin
  frm2:=tform2.getinstance;
  frm2.free;
end;

{ tsingleton }

destructor tsingleton.destroy;
begin
  getinstanceptr(1);
  inherited;
end;

class function tsingleton.getinstance: tsingleton;
begin
  result:=pointer(getinstanceptr(0));
end;

class function tsingleton.getinstanceptr(value:integer): integer;
const

本文关键:设计模式之singleton
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top