用Delphi实现Singleton模式

Singleton模式定义:
Singleton(一般译作单件或单态)模式,它是设计模式中比较简单而常用的模式。有些时候在整个应用程序中,会要求某个类有且只有一个实例,这个时候可以采用Singleton模式进行设计。 关于Singleton模式的详细介绍,请参见GOF的著作《设计模式》,俺比较节省纸张,不摘抄过来了。

实现方法:

Delphi中有两个方法是负责创建与销毁对象的:

class function NewInstance: TObject; virtual;
    
    
procedure FreeInstance; virtual;
    
    

NewInstance是负责创建对象分配对象内存空间,FreeInstance则负责清除对象实例并且释放占用的内存空间,具体这两个方法的实现过程可以参看System.pas中的代码。

我们还需要这两个变量:

var
    
    
  Instance  : TSingleton  = nil;
    
    
  Ref_Count : Integer     = 0;
    
    

Instance TSingleton对象的实例变量,Ref_Count则负责保存对象实例被创建的次数,以方便我们追踪对象的引用.

下面我们声明TSingleton对象:

type
    
    
  TSingleton = class
    
    
  public
    
    
    class function NewInstance: TObject; override;
    
    
    procedure FreeInstance; override;
    
    
    class function RefCount: Integer;
    
    
  end;
    
    

 

我添加RefCount方法是为了能看到这个类的实际工作,通过这个方法可以查看对象的引用计数,但这个方法并非实现TSingleton对象所必须的方法。

那我们接下来就实现上面声明的三个方法:

class function TSingleton.NewInstance: TObject;
    
    
begin
    
    
  if ( not Assigned( Instance ) ) then
    
    
  begin
    
    
    Instance := inherited NewInstance as TSingleton;
    
    
    // 在这里可以初始化些局部变量例如:
     
     
    // Instance.Variable := Value;
    
    
  end;
    
    
  Result := Instance;
    
    
  // 增加引用计数
     
     
  Inc( Ref_Count );
    
    
end;
    
    

   
   
    
     
   
   
procedure TSingleton.FreeInstance;
    
    
begin
     
     
  // 减少引用计数
     
     
  Dec( Ref_Count );
    
    
  //当引用计数为0时,释放该对象实例
     
     
  if ( Ref_Count = 0 ) then
    
    
  begin
    
    
    Instance := nil;
    
    
    // Destroy 局部变量可以写在这
     
     
    inherited FreeInstance;
    
    
  end;
    
    
end;
    
    

    
    
     
      
    
    
class function TSingleton.RefCount: Integer;
    
    
begin
     
     
  //返回引用计数
     
     
  Result := Ref_Count;
    
    
end;
    
    

上面的代码覆盖了NewInstance这个方法,只要判断TSingleton对象的实例已经存在,就直接返回对象实例,并增加对象的引用计数。同样我们覆盖了FreeInstance方法,只有当引用计数为零时,才真正的释放对象实例。这样的话在对象外部无论调用构造与析构方法多少次,真正创建与释放的只有一个对象实例。

上述代码在D 5,D6,D7均可正常使用,在D2005,D2006中对于Singleton模式还有更好的构造方法,这里就不继续探讨了。

测试代码:

procedure Test;
    
    
var
    
    
  s1, s2 : TSingleton;
    
    
begin
    
    
  s1 := TSingleton.Create;
    
    
  s2 := TSingleton.Create;
    
    
  s2.Free;
    
    
  s1.Free;
    
    
end;
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值