- 1. Example
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.
Example
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;