前言
Delphi 语法,有类方法 class procedure 和 class function ;也有类变量 class var。
可以用来干嘛?
场景
WebService 服务器端,多个 SoapDataModule 共用的方法,放到一个 DataModule 里面去。
每次 SOAP 调用,需要在 SoapDataModule 实现接口方法里面,创建该 DataModule 的实例,调用其方法,然后释放。
创建和释放的代码,总是重复。并且,没有对象缓冲池。
当然,可以给这个 DataModule 实现一个基于接口释放的对象缓冲池,但代码架构就比较复杂了。
如果想少写代码,则可考虑在该 DataModule 里面实现自己的创建和释放以及缓冲管理的代码。
背景:
请查阅本篇文章的上一篇文章。
代码例子
以下代码测试通过
该模块自己实现自己的缓冲池的代码
unit UDmPool;
interface
uses
System.SysUtils, System.Classes;
type
TDmPool = class(TDataModule)
private
{ Private declarations }
class var FList: TList;
public
{ Public declarations }
class function GetMyDM: TDmPool;
class procedure ReleaseDM(DM: TDmPool);
class function GetPoolCount: Integer;
function HelloPool(const S: string): string;
end;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
{ TDmPool }
class function TDmPool.GetMyDM: TDmPool;
var
DM: TDmPool;
begin
if not Assigned(FList) then FList := TList.Create;
if FList.Count = 0 then
begin
DM := TDmPool.Create(nil);
Result := DM;
end
else
begin
DM := TDmPool(FList.Items[0]);
FList.Delete(0);
end;
end;
class function TDmPool.GetPoolCount: Integer;
begin
if not Assigned(FList) then
begin
Result := 0;
Exit;
end;
Result := FList.Count;
end;
function TDmPool.HelloPool(const S: string): string;
begin
Result := 'Hello, ' + S + '; This is DmPool';
end;
class procedure TDmPool.ReleaseDM(DM: TDmPool);
begin
FList.Add(DM);
end;
end.
在 SOAPDATAMODULE 里面调用它的代码
function TSoapDM_A.HelloPool(const S: string): string;
var
DM: TDmPool;
begin
DM := TDmPool.GetMyDM;
Result := DM.HelloPool('SoapDM_A' + S);
TDmPool.ReleaseDM(DM);
end;
服务器端界面显示缓冲池数量的代码
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label2.Caption := 'PoolCount = ' + TDmPool.GetPoolCount.ToString;
end;
结论:
使用 class function 和 class var 可以解决把重复代码集中实现在一个类里面的预期。同时实现一个简单的缓冲池。