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然后:
一个普通的Delphi开发人员通常永远不会发生这种情况,但如果没有它,整个Delphi RAD体验就不会存在.
Allen Bauer(Embarcadero的首席科学家)也写了一篇关于这个主题的短篇博客 文章.还有一个SO有关的问题正在使用虚拟构造哪里.
如果对虚拟的Create构造函数主题有足够的了解,请告诉我:-)
--jeroen
你可以找到Marco Cantu关于GOF模式和Delphi习语等价的优秀文章.我记得参加他关于这个主题的Borcon会议,这很棒.
要记住的一个主要想法是需要设计模式来补充语言/框架的缺点.如果你有一个本土成语,你不需要重新发明轮子并实现整个GOF shebang,只需要学会识别它并命名它(正如Jeroen 对工厂的精湛解释所做的那样).