The functionality used in Delphi's VCL to create forms and components is similar in concept to the builder. Delphi creates forms using a common interface, through Application.CreateForm and through the TForm class constructor. TForm implements a common constructor using the resource information (DFM file) to instantiate the components owned by the form. Many descendant classes reuse this same construction process to create different representations. Delphi also makes developer extensions easy. TForm's OnCreate event also adds a hook into the builder process to make the functionality easy to extend.
The following example includes a class TAbstractFormBuilder and two concrete classes TRedFormBuilder and TBlueFormBuilder. For ease of development some common functionality of the concrete classes has been moved into the shared TAbstractFormBuilder class.
type TAbstractFormBuilder = class private FForm: TForm; procedure BuilderFormClose(Sender: TObject; var Action: TCloseAction); protected function GetForm: TForm; virtual; public procedure CreateForm(AOwner: TComponent); virtual; procedure CreateSpeedButton; virtual; abstract; procedure CreateEdit; virtual; abstract; procedure CreateLabel; virtual; abstract; property Form: TForm read GetForm; end; type TRedFormBuilder = class(TAbstractFormBuilder) private FNextLeft, FNextTop: Integer; public procedure CreateForm(AOwner: TComponent); override; procedure CreateSpeedButton; override; procedure CreateEdit; override; procedure CreateLabel; override; end; type TBlueFormBuilder = class(TAbstractFormBuilder) private FNextLeft, FNextTop: Integer; public procedure CreateForm(AOwner: TComponent); override; procedure CreateSpeedButton; override; procedure CreateEdit; override; procedure CreateLabel; override; end;
At runtime the client application instructs one of the concrete classes to create parts using the public part creation procedures. The concrete builder instance is passed to the following procedure:
procedure TForm1.Create3ComponentFormUsingBuilder(ABuilder: TAbstractFormBuilder); var NewForm: TForm; begin with ABuilder do begin CreateForm(Application); CreateEdit; CreateSpeedButton; CreateLabel; NewForm := Form; if NewForm <> nil then NewForm.Show; end; end;