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;