- 1. Пример
Функциональность, используемая в VCL Delphi для создания форм и компонентов, похожа на концепцию строителя. Delphi создает формы, используя общий интерфейс, через Application.CreateForm и через конструктор класса TForm. TForm реализует общий конструктор, используя информацию о ресурсах (файл DFM), чтобы создать экземпляр компонентов, принадлежащих форме. Многие классы потомков повторно используют этот же процесс построения для создания разных представлений. Delphi также упрощает разработку расширений. Событие OnCreate от TForm также добавляет hook в процесс создания, чтобы упростить работу.
Пример
Следующий пример включает класс TAbstractFormBuilder и два конкретных класса TRedFormBuilder и TBlueFormBuilder. Для простоты разработки некоторые общие функциональные возможности конкретных классов были перемещены в общий класс TAbstractFormBuilder.
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;
Во время выполнения клиентское приложение инструктирует один из конкретных классов создавать части, используя процедуры создания публичных частей. Экземпляр конкретного строителя передается следующей процедуре:
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;