您在常见的Delphi编程中实现了哪些设计模式?

Jur*_*nka 10 delphi design-patterns

您在常见的Delphi编程中实现了哪些设计模式?在Delphi编程中哪些模式更容易适应?(每种语言在不同领域都很出色,那么使用Delphi时哪些模式可能是非常强大的结构?)

我很高兴,如果你能说出Delphi 2009/2010的设计模式的一些变化(因为那些支持泛型,以及2010年的RTTI).

在野外互联网上有很多文章,但它们没有讨论日常可用性和模式的变化.(他们中的大多数只讨论语言细节,架构的变化).

Jer*_*ers 22

只有少数Delphi开发人员知道每个Delphi开发人员都使用Factory模式(delphi.about.com 在"常规"Delphi中有一个例子),但随后使用虚拟Create构造函数实现.

所以:时间有点说明:-)

虚拟构造函数对于像虚拟方法的类就像对象实例一样.

工厂模式的整个想法是,您可以分离确定从实际创建中创建的事物(在本例中为"对象实例")的类型(在本例中为"类")的逻辑.

它使用虚拟的Create构造函数就是这样的:

TComponent有一个虚拟的Create构造函数,可以被任何降序类覆盖:

type
  TComponent = class(TPersistent, ...)
    constructor Create(AOwner: TComponent); virtual;
    ...
  end;
Run Code Online (Sandbox Code Playgroud)

例如,TDirectoryListBox.Create构造函数会覆盖它:

type
  TDirectoryListBox = class(...)
    constructor Create(AOwner: TComponent); override;
    ...
  end;
Run Code Online (Sandbox Code Playgroud)

您可以在"类型类型"类型的变量中存储类引用(类似于对象实例引用的类).对于组件类,Classes单元中有一个预定义类型的TComponentClass:

type
  TComponentClass = class of TComponent;
Run Code Online (Sandbox Code Playgroud)

如果您有一个TComponentClass类型的变量(或参数),您可以进行多态构造,这与工厂模式非常相似:

var
  ClassToCreate: TComponentClass;

...

procedure SomeMethodInSomeUnit;
begin
  ClassToCreate := TButton;
end;

...

procedure AnotherMethodInAnotherUnit;
var
  CreatedComponent: TComponent;
begin
  CreatedComponent := ClassToCreate.Create(Application);
  ...
end;
Run Code Online (Sandbox Code Playgroud)

Delphi RTL在这里使用它:

Result := TComponentClass(FindClass(ReadStr)).Create(nil);
Run Code Online (Sandbox Code Playgroud)

和这里:

// create another instance of this kind of grid
SubGrid := TCustomDBGrid(TComponentClass(Self.ClassType).Create(Self));
Run Code Online (Sandbox Code Playgroud)

Delphi RTL中的第一个用途是整个创建过程如何处理从DFM文件中读取的表单,数据模块,框架和组件.

表单(datamodule/frame/...)实际上有一个(已发布的)表单上的组件列表(datamodule/frame/...).该列表包括每个组件的实例名称和类引用.在读取DFM文件时,Delphi RTL然后:

  1. 找到组件实例名称,
  2. 使用该名称来查找基础类引用,
  3. 然后使用类引用动态创建正确的对象

一个普通的Delphi开发人员通常永远不会发生这种情况,但如果没有它,整个Delphi RAD体验就不会存在.

Allen Bauer(Embarcadero的首席科学家)也写了一篇关于这个主题的短篇博客 文章.还有一个SO有关的问题正在使用虚拟构造哪里.

如果对虚拟的Create构造函数主题有足够的了解,请告诉我:-)

--jeroen

  • 很好的例子.有一点需要注意.其他语言中的工厂模式实现使用普通的静态函数(或者用于pascalites的_class_函数).因此,它们能够返回null(_nil_).除非引发异常,否则Delphi构造函数(如其他语言中的无名构造函数)将始终返回对象引用.当然,如果需要,您可以轻松使用类功能. (2认同)

Fra*_*ois 6

你可以找到Marco Cantu关于GOF模式和Delphi习语等价的优秀文章.我记得参加他关于这个主题的Borcon会议,这很棒.
要记住的一个主要想法是需要设计模式来补充语言/框架的缺点.如果你有一个本土成语,你不需要重新发明轮子并实现整个GOF shebang,只需要学会识别它并命名它(正如Jeroen 对工厂的精湛解释所做的那样).