设计模式、用Delphi实现---->Singleton 模式

原创 2001年11月28日 08:59:00

Singleton模式

起源

DelphiSINGLETON模式是在SINGLETON的基础上进行了扩展。更多SINGLETON模式的资料请参阅 《设计模式84页》<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

目的

保证一个类仅有一个实例,并提供一个访问它的全局访问点,一个相对简单的应用型设计模式

动机

此模式最重要的是保证大量类正确的访问单个实例。尽管一台个系统可能有多台打印机,但系统只允许有且只有一个打印缓存。同样比如:一个系统只有一个文件系统、一个窗体管理系统。对于DelphiVCL来说:大家天天接触的TapplicationTscreenTclipboard都是。此模式更好的是使你可以在任何时候为你的应用程序提供一个全局对象。其它的用途:可以、提供一些全局的异常句柄,安全控制,为跨进程提供单一的访问点。

怎样保持一个类只有一个实例并且建立好的访问性能?一个全局变量保证了实例的可访问性,但还没有保证多个实例的同时存大的可能。

一个好的解决方案:建立类自身来负责保持自身一个实例的机制。类的第一个实例能保存不会再有类的实例被创建(在创建类的新实例时请求被中段)。并提供一个访问类的方法。这就是我们的singleton模式,典型的应用是建立服务型的的类。

 

应用

假设有一个用于显示时间进度低级服务Tprogressor。类包括两个典型的方法:StartProgress, EndProgress, Abort 和一些常用的属性如:Progress, Aborted其它。

下面代码是Tprogressor类的接口部份

type

  TProgressor = class (TObject)

  private

    FProgress: Integer;

  protected

    procedure SetProgress(Value: Integer);

  public

»   procedure StartProgress;

»   property Progress: Integer read FProgress write SetProgress;

  end;

 

下面的代码是应用了singleton模式后的类的的接口部份。

type

  TProgressor = class (TObject)

  private

    FProgress: Integer;

  protected

    constructor CreateInstance;

    class function AccessInstance(Request: Integer): TProgressor;

    procedure SetProgress(Value: Integer);

  public

    constructor Create;

    destructor Destroy; override;

    class function Instance: TProgressor;

    class procedure ReleaseInstance;

»   procedure StartProgress;

»   property Progress: Integer read FProgress write SetProgress;

  end;

 

类接口部份的介绍:

·      方法class function Instance用于访问类的单件的实例。此方法一般在第一时间访问类的实例被创建。

·      类构造器被重载,如果你尝试着不通过instance方法来构建一个新的实例将会抛出一个异常。

·      可通过调用ReleaseInstance来清除单件类存在的实例。一般在你要清除部件时调节器用些方法。在Delphi 1 exit过程中调用,在Delphi 2/3/4/5/6中在单元finalization中调用。不要访问TProgressor.Instance.Free来清除实例,

 

现在让我们来看看singleton模式实现。

constructor TProgressor.Create;

begin

  inherited Create;

  raise Exception.CreateFmt('Access class %s through Instance only',

      [ClassName]);

end;

 

constructor TProgressor.CreateInstance;

begin

  inherited Create;

end;

 

destructor TProgressor.Destroy;

begin

  if AccessInstance(0) = Self then AccessInstance(2);

  inherited Destroy;

end;

 

class function TProgressor.AccessInstance(Request: Integer): TProgressor;

  const FInstance: TProgressor = nil;

begin

  case Request of

    0 : ;

    1 : if not Assigned(FInstance) then FInstance := CreateInstance;

    2 : FInstance := nil;

  else

    raise Exception.CreateFmt('Illegal request %d in AccessInstance',

        [Request]);

  end;

  Result := FInstance;

end;

 

class function TProgressor.Instance: TProgressor;

begin

  Result := AccessInstance(1);

end;

 

class procedure TProgressor.ReleaseInstance;

begin

  AccessInstance(0).Free;

end;

 

procedure TProgressor.SetProgress(Value: Integer);

begin

»加入实现代码

end;

 

procedure TProgressor.StartProgress;

begin

»加入实现代码

end;

 

此模式的密秘在AccessInstance方法,AccessInstance方法使用了常量来存放实例。

由于Delphi不支持静态类字段的原因,你必需使用此方法。AccessInstance根据请求的参数来确认不同的返回方式,返回当前实例(Request = 0),创建一个实例(Request = 1),重置实例(Request = 2)。Delphi 2/3/4/5/6中,你必须将编译器设置$J+来支持形式常量(参见Delphi在线帮助)

CreateInstance设成保护方法(protected),我们确保了其它类不能调用类的构造器。但由于构造函数本身为虚函数的原因,它可以被后代重载。例中,当第一次调用类实例时将确认类的具体类型。

唯一需要你手动添加的代码是:在单元的initializationfinalization加入清除代码。

下面是应用实例(Delphi1.0

 

unit ProgressorTest;

 

...

...

 

implementation

 

...

...

 

procedure ShutDown; far;

begin

» TProgressor.ReleaseInstance;

end;

 

initialization

MMWIN:START INITIALIZATION

» AddExitProc(ShutDown);

end.

 

具体操作Tprogressor的代码:

 

procedure TSomeClass.DoSomething;

var I: Integer;

begin

» TProgressor.Instance.StartProgress;

» for I := 0 to 100 do

» begin

»   TProgressor.Instance.Progress := I;

» ..{ 完成其它的工作}

» end;

» TProgressor.Instance.EndProgress;

end;

Delphi实例

正在组织

[Java设计模式](一)怎样实现Singleton(单例)模式编程

单例模式是开发模式中最简单,最易于理解的一种模式。简单地说,它指的就是始终保持一个实例的意思。但是,Java的类是可以穿件多个实例的,那么,怎么实现呢? 顾名思义,单例模式就是只有一个实例。单例模式确...
  • u012942818
  • u012942818
  • 2015年03月30日 15:20
  • 1142

java设计模式学习系列之一:单例模式(Singleton)

单例模式(Singleton)    1.介绍:也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们...
  • qjyong
  • qjyong
  • 2007年08月01日 17:09
  • 21735

设计模式(创建型)之单例模式(Singleton Pattern)

单例模式可能是23种设计模式中最简单的。应用也非常广泛,譬如Android中的数据库访问等操作都可以运用单例模式。核心概念: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称...
  • yanbober
  • yanbober
  • 2015年04月27日 16:50
  • 2671

javascript设计模式-singleton(单例)模式

singleton(单例)模式被熟知的原因是因为它限制了类的实例化次数只能一次,单例模式,在该实例不存在的勤快下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,则会简单返回该对象的...
  • yilanyoumeng3
  • yilanyoumeng3
  • 2016年08月22日 14:38
  • 723

设计模式-单例模式(Singleton)各种写法和分析比较

介绍单例模式是设计模式中比较简单容易理解的。它的出现主要是: 保证一个类仅有一个实例,并提供一个访问它的全局访问点 其实就在系统运行期间中保证只有这么一个实例,并能够全局访问。应用场景就是当需要一...
  • Card361401376
  • Card361401376
  • 2016年05月07日 23:51
  • 3844

singleton模式的几种实现方式

一、最简单的方式 public static Singleton getInstance() { if (instance == null) { instance = new...
  • lxgwm2008
  • lxgwm2008
  • 2012年07月02日 22:17
  • 3568

设计模式实例(Lua)笔记之三(Singleton单例模式)

1.描述: 这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个...
  • my183100521
  • my183100521
  • 2015年08月20日 10:19
  • 1791

C++设计模式5--单例模式Singleton--当前对象只有一个实例

很多情况下,我们在开发项目的过程中,都希望自己运行的某个部件只有一个实例, 比如我们天天用QT开发界面,QTCreate里帮助菜单下的关于Qt Create菜单,弹出来的关于对话框,在QTCreate...
  • gatieme
  • gatieme
  • 2014年01月08日 13:25
  • 21468

用Delphi实现Singleton模式

Singleton模式定义:Singleton(一般译作单件或单态)模式,它是设计模式中比较简单而常用的模式。有些时候在整个应用程序中,会要求某个类有且只有一个实例,这个时候可以采用Singleton...
  • happy_david
  • happy_david
  • 2006年05月17日 15:21
  • 1522

delphi版大话设计模式

前段时间听到一个小家伙说, 只听过JAVA. C#有设计模式, DELPHI应该没有吧, 我听了窃笑,  但又不好明说,  一来,  用delphi的人现在本来就很少了,   以前做delphi的年龄...
  • x34205
  • x34205
  • 2013年09月29日 22:42
  • 741
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式、用Delphi实现---->Singleton 模式
举报原因:
原因补充:

(最多只允许输入30个字)