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

时间:2009-10-18 11:41:17

标签: delphi design-patterns

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

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

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

6 个答案:

答案 0 :(得分:22)

只有少数Delphi开发人员知道每个Delphi开发人员都使用Factory pattern(delphi.about.com有example in "regular" Delphi),但随后使用虚拟Create构造函数实现。

所以:是时候了解一下: - )

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

工厂模式的整个想法是,你将决定从实际创建中创建的东西(在本例中为“对象实例”)的类型(在本例中为“类”)的逻辑去耦。

它使用虚拟的Create构造函数:

TComponent有一个virtual Create constructor,所以可以被任何降序类覆盖:

type
  TComponent = class(TPersistent, ...)
    constructor Create(AOwner: TComponent); virtual;
    ...
  end;

例如TDirectoryListBox.Create constructor会覆盖它:

type
  TDirectoryListBox = class(...)
    constructor Create(AOwner: TComponent); override;
    ...
  end;

您可以在“类型类型”类型的变量中存储类引用(类似于对象实例引用的类)。对于组件类,有一个预定义类型TComponentClass in the Classes unit

type
  TComponentClass = class of TComponent;

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

var
  ClassToCreate: TComponentClass;

...

procedure SomeMethodInSomeUnit;
begin
  ClassToCreate := TButton;
end;

...

procedure AnotherMethodInAnotherUnit;
var
  CreatedComponent: TComponent;
begin
  CreatedComponent := ClassToCreate.Create(Application);
  ...
end;

Delphi RTL在这里使用它:

Result := TComponentClass(FindClass(ReadStr)).Create(nil);

在这里:

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

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

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

  1. 查找组件实例名称
  2. 使用该名称查找基础类引用,
  3. 然后使用类引用动态创建正确的对象
  4. 普通的Delphi开发人员通常从未发现过这种情况,但如果没有它,整个Delphi RAD体验都不会存在。

    Allen Bauer(Embarcadero的首席科学家)也写了一篇简短的blog article about this topic。 关于SO还有where virtual constructors are being used个问题。

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

    - 的Jeroen

答案 1 :(得分:6)

你可以找到关于GOF模式和Delphi习语等价的an excellent article by Marco Cantu。我记得参加他关于这个主题的Borcon会议,这很棒 要记住的一个主要想法是需要设计模式来补充语言/框架的缺点。如果你有一个原生的习语,你不需要重新发明轮子并实现整个GOF shebang,只要学会识别并命名它(正如Jeroen对他的superb explanation on the Factory所做的那样)。

答案 2 :(得分:2)

我经常使用以下模式:

  1. MVC中的观察者
  2. Singlton
  3. 模板方法
  4. 国家

答案 3 :(得分:2)

我经常使用以下模式:

  • 命令
  • 访客
  • 表数据网关
  • 观察员
  • 适配器
  • Singleton(非常小心!)
  • 抽象工厂
  • 工厂方法
  • 所有形式的依赖注入
  • Facade
  • 服务定位器
  • 分隔界面

答案 4 :(得分:2)

非OOP编程(有人称之为结构化编程)在Delphi程序员中很常见。它非常简单:您创建一个执行某项操作的函数,它与记录/类似对象的数据结构无关。示例:IntToStr()

Delphi做得非常好,因为使用接口/实现部分提供封装,并且因为生成的机器代码非常有效。在编译时,它还支持对其进行优化,例如,如果在接口部分中有一个类型化常量,并且程序已完全编译 - 如果然后更改该常量的值,则不重新编译单元,只有常量变化。这在日常工作中并不是必需的,但它是Delphi如何工作的一个例子。

答案 5 :(得分:2)

一个普通的Unit表现得像一个单身人士。你不能使用继承和多态性等OOP技术,但这可能是一件好事:)

我一般认为Delphi太容易避免声音oop设计。对于RAD来说这很好,但是如果你想要一个灵活且可维护的代码,你需要知道要避免哪些陷阱。例如,您添加到表单的组件的公共可见性,TForm1类型的全局Form1变量(而不是手动管理的生命周期和基类作为类型)以及GUI和业务逻辑之间缺乏分离。只是提一些问题。