设计模式之singleton

2016-02-19 18:24 7 1 收藏

今天图老师小编要跟大家分享设计模式之singleton,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

 

  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 (isave0) 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;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  {$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
    isave:integer=0;
  var
    p:^integer;
    obj:Tsingleton;
  begin
    p:=@isave;
    obj:=nil;
    case value of
    0:
      begin
        if (isave0) then
        begin
          result:=isave;
          obj:=pointer(isave);
        end;
        if not assigned(obj) then
        begin
          obj:=Tsingleton.Create;
          p^:=integer(obj);
          result:=isave;
        end
      end;
    1:
      begin
        p^:=0;
      end;
    end;
  end;

   

  procedure TSingleton.SetUsername(const Value: string);
  begin
    Fusername := Value;
  end;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  procedure TForm1.Button3Click(Sender: TObject);
  var
    singleton:Tsingleton;
  begin
    singleton:=Tsingleton.GetInstance;
    singleton.Username:=Edit1.Text;
  end;

  procedure TForm1.Button4Click(Sender: TObject);
  var
    singleton:Tsingleton;
  begin
    singleton:=Tsingleton.GetInstance;
    Edit2.Text:=singleton.Username;
  end;

  procedure TForm1.Button5Click(Sender: TObject);
  var
    singleton:Tsingleton;
  begin
    singleton:=Tsingleton.GetInstance;
    singleton.Free;
  end;

  end.

来源:http://www.tulaoshi.com/n/20160219/1617546.html

延伸阅读
策略模式其实特别简单(听到这句话,大家是不是心里一下子放松了?)。 比如排序,官方告诉大家我这里有一个排序的接口ISort的sort()方法,然后民间各尽其能,实现这个排序的方法:冒泡,快速,堆等等。 这些方法就是“不同的策略”。 然后,某个模块下,需要一个排序方法,但是暂时不能指定具体的sort方法(出于扩展的考虑),就需要使用ISort接...
构建模式主要用来针对复杂产品生产,分离部件构建细节,以达到良好的伸缩性。 考虑到设计模式
这是一个真实的案例,我们在项目中使用Spring和ACEGI,我之所以选择ACEGI,除了它对权限的良好控制外, 我还看好它的SecurityContextHolder,通过代码 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 我可以很容易在系统任意一层得到用户的信息,而不用把用户信息在参数里传来传去,(这也...
一、引子 俗话说:世上难买后悔药。所以凡事讲究个“三思而后行”,但总常见有人做“痛心疾首”状:当初我要是……。假如真的有《大话西游》中能时光倒流的“月光宝盒”,那这世上也许会少一些伤感与后悔——当然这只能是痴人说梦了。 但是在我们手指下的程序世界里,却有的后悔药买。今天我们要讲的备忘录模式便是程...
上次我们简单介绍了静态成员,今天再延伸一下,看看设计模式中的单件模式(Singleton),我先照搬一些理论 Singleton-对象创建型模式意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。动机:对于一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只应该有一个打印假脱机(printer spooler),只应该有一个文件...

经验教程

107

收藏

14
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部