4. 统领全局的Singleton对象
GOF的设计模式看了N遍,忘了N遍,大多数东西,都因为自己的内力不够只记住了名字。
但忘不了的就是这个最简单的Singleton模式了
系统中一般都会有一些类似全局变量的东西,我以前就把这些全局变量或公共函数都定义
在一个单元文件中.自从知道了Singleton之后,我就用它来代替这个单元文件了。(或许
有人会认为这个单元文件完全可以代替Singleton,我认为也对,见仁见智吧)
以前看过几个用Delhi实现的Singleton模式,当时好象没弄明白,或者感到他们实现的
复杂,我就按自己的理解实现了。Delphi最大的缺憾就是没有static data member,我只好
用了一点非OO的东西,在implemetation中定义一个不属于类的变量来模拟static。
代码大致如下
--------------------------------------------------------------
type
TPM = class(TObject)
public
//程序名称
AppName:string;
Version:string;
//对话框标题
BoxTitle:string;
//数据库类型
DbType:string;
//数据库连接对象(并不在此类中实例化)
ConnObj:TAdoConnection;
Login:TLogin;
private
constructor Create;
public
destructor Destroy;override;
class function GetSelf: TPM;
procedure Release();
end;
implementation
var
u_self:TPM;
class function TPM.GetSelf():TPM;
begin
if u_self=nil then u_self:=TPM.Create;
Result:=u_self;
end;
constructor TPM.Create;
begin
Login:=TLogin.Create();
end;
destructor TPM.Destroy;
begin
FreeAndNil(FLogin);
end;
procedure TPM.Release();
begin
FreeAndNil(u_self);
end;
--------------------------------------------------------------------------
TPM.ConnObj在系统入口处指向一个已经实例化并成功连接的TAdoConnection对象。
在任何想使用数据连接,版本号等“全局量”的地方,只需要简单的引用
TPM.ConnObj,TPM.Version。在系统登录窗口将用户的登录名,权限,登录时间赋值到
TPM.Login对象中,会使得基于用户、角色的处理变的清晰简单。
TPM含义为Program Manager,它作为一个Singleton对象,在任何需要的时候都会已经
实例化了,并且该类只有一个对象在内存中。事实上,我的系统还用它完全接管了
messageBox的显示,异常的处理。它就象一个领导一样,背着手,在系统的各个模块
之间走来走去。
(未完)