关闭

用Delphi实现Singleton模式

标签: delphiintegerfunctionclass设计模式测试
1455人阅读 评论(0) 收藏 举报

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:100258次
    • 积分:1532
    • 等级:
    • 排名:千里之外
    • 原创:45篇
    • 转载:9篇
    • 译文:1篇
    • 评论:57条
    最新评论