设计模式之singleton

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

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

【 tulaoshi.com - 编程语言 】

 

  program singletonTest;

  uses
    Forms,
    mainfrm in 'mainfrm.pas' {Form1},
    singletonfrm in 'singletonfrm.pas' {Form2};

  {$R *.res}

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

  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;

  {$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;

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

  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;

  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.

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

延伸阅读
  先和大家说说什么是singleton模式的,它中文意应该为单一模式,但好别扭,也不知道是谁翻译的 29796428(qiubole) 12:26:46 它属于创建模式的一种 29796428(qiubole) 12:27:00 主要的作用就是确实一个类有且只有唯一的一个实例 29796428(qiubole) 12:27:10 这在实际当中,其实还是有一些用处的 29796428(...
构建模式主要用来针对复杂产品生产,分离部件构建细节,以达到良好的伸缩性。 考虑到设计模式
一、引子 俗话说:世上难买后悔药。所以凡事讲究个“三思而后行”,但总常见有人做“痛心疾首”状:当初我要是……。假如真的有《大话西游》中能时光倒流的“月光宝盒”,那这世上也许会少一些伤感与后悔——当然这只能是痴人说梦了。 但是在我们手指下的程序世界里,却有的后悔药买。今天我们要讲的备忘录模式便是程...
本系列文章将向大家介绍一下 C#的设计模式 ,此为第十一篇文章,相信对大家会有所帮助的。废话不多说,继续来看。 意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。 场景 我们知道,一个网络游戏通常会有多个游戏大区。每一个游戏大区会有...
本系列文章将向大家介绍一下 C#的设计模式 ,此为第十三篇文章,相信对大家会有所帮助的。废话不多说,继续来看。 意图 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 场景 在设计网络游戏的武器系统时,开始并没有考虑到武器的强化和磨损。之后,策划人员说希望给游...

经验教程

512

收藏

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