我正在尝试使用records在 Delphi 中实现Builder 设计模式。我的目标是允许方法链接,类似于在 Kotlin、Java 或 Swift 中的做法。例如:
val alertDialog = AlertDialog.Builder(this)
.setTitle("Builder Example")
.setMessage("This is a builder pattern example")
.create()
在 Delphi 中,我使用记录编写了以下代码:
type
TAlertDialogBuilder = record
private
FTitle: string;
FMessage: string;
public
function SetTitle(const ATitle: string): TAlertDialogBuilder;
function SetMessage(const AMessage: string): TAlertDialogBuilder;
procedure CreateAndShow;
end;
implementation
function TAlertDialogBuilder.SetTitle(const ATitle: string): TAlertDialogBuilder;
begin
FTitle := ATitle;
Result := Self; // Creates a copy
end;
function TAlertDialogBuilder.SetMessage(const AMessage: string): TAlertDialogBuilder;
begin
FMessage := AMessage;
Result := Self; // Creates a copy
end;
procedure TAlertDialogBuilder.CreateAndShow;
begin
ShowMessage(Format('Title: %s%sMessage: %s', [FTitle, sLineBreak, FMessage]));
end;
我这样使用它:
procedure ShowDialogExample;
begin
TAlertDialogBuilder.Create
.SetTitle('Builder Example')
.SetMessage('This is a builder pattern example')
.CreateAndShow;
end;
问题:
由于记录在 Delphi 中是值类型,因此在和Self
等方法中返回的结果将复制该记录。这效率不高,尤其是当记录包含许多字段或大量数据时。SetTitle
SetMessage
我尝试过的:
返回指向记录的指针:我修改了方法,使其返回指向记录的指针(
PAlertDialogBuilder
)而不是Self
。虽然这避免了复制,但它使链接变得不那么直观,因为我需要取消引用指针以^
进行后续调用。使用
absolute
:我考虑使用absolute
关键字来避免复制,但我无法找到让它用于链接方法调用的方法。切换到类:我知道类可以避免这个问题,因为它们是引用类型,但如果可能的话,我宁愿坚持使用记录,因为它们具有轻量级的特性和值语义。
我的问题:
如何使用记录在 Delphi 中实现 Builder 模式,同时避免不必要的复制?有没有办法absolute
或其他方法可以有效地实现这一点?
不,你不需要。使用取消引用指针
^
是可选的。这是记录的:使用指针的扩展语法
一种选择是将 Builder 本身更改为接口类(以避免泄漏),例如: