这种设计模式叫什么名字?

4

我经常会写一些像这样使用的类:

  • 创建一个类的对象
  • 在该对象上调用某些“Run”或“Execute”方法
  • 销毁该对象

这会给调用代码增加一些开销,例如:

var
  Foo: TFoo;
begin
  Foo := TFoo.Create(...);
  try
    Foo.Run(...);
  finally
    Foo.Free;
  end;
end;

这段话可以简化为以下内容:
begin
  TFoo.Run(...);
end;

在这种情况下,包含TFoo类的单元将如下所示:
type
  TFoo = class
  private
    FBar: TBar;
    procedure InternalRun;
  public
    class procedure Run(ABar: TBar); static;
  end;

class procedure TFoo.Run(ABar: TBar);
var
  Foo: TFoo;
begin
  Foo := TFoo.Create;
  try
    Foo.FBar := ABar;
    Foo.InternalRun;
  finally
    Foo.Free;
  end;
end;

这种设计模式的名字是什么?

调用代码的开销被转移到了TFoo类中。


3
你在寻找什么?一个广泛使用的名字吗?这确实是一种广泛使用的技术。我只是怀疑它是否有一个名字,因为它太琐碎了。 - David Heffernan
@DavidHeffernan 我正在寻找一个好的名称来描述这个模式,我会相应地重新表述问题。 - Jens Mühlenhoff
在这种情况下,为什么要实例化TFoo?相反,为什么不将TFoo.InternalRun扩展为TFoo.Run? - 500 - Internal Server Error
@500-服务器内部错误 在这个简单的例子中,这将起作用,在那种情况下它就像一个Singleton,但我问的是可能有多个实例的情况(例如在不同的线程中)。 - Jens Mühlenhoff
不算真正的单例,因为那意味着状态。这里没有状态,只是将参数转换为实例字段。在我看来,它应该保持为参数。(我确实意识到你这里有一个人为的例子。) - 500 - Internal Server Error
这对我来说看起来像是一个创造型模式(比如Factory)和一个行为型模式(比如Strategy或Template)的组合。你会创建一个实例,然后使用它的行为。我同意@DavidHeffernan的观点,认为这更多地是一种常用技术,而不是一种模式本身。 - Guillem Vicens
2个回答

3

也许更像是FunctionObject,只不过Delphi不支持重载函数调用运算符。http://c2.com/cgi/wiki?FunctionObject - Jens Mühlenhoff

2

命令。我在构造函数中创建带有目标的命令,然后(立即或将来的某个时间)调用execute方法。这对于GUI中可撤销的操作非常有用,在其中您还可以添加一个撤销方法,并在执行完成时将其添加到列表中。 - Nat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接