Главная » Delphi » Delphi 2006 – Шаблон Builder (Строитель)

0

Данный шаблон полезен, когда требуется конструировать объекты сложной структуры, причем процесс их конструирования может состоять из нескольких скрытых (отделенных от пользователя) шагов. Более того, последовательность и содержание этих шагов могут меняться в зависимости от исходных требований и параметров Строителя.

Работает данный шаблон так. Создается экземпляр Конкретного строителя TConcreteBuilder, далее — связанный с ним экземпляр Распорядителя TDirector, ответственного за формирование итогового продукта. В дальнейшем Распорядитель управляет работой Конкретного строителя, отдавая ему команды на создание той или иной части финального продукта. Команды эти обычно скрыты внутри единого метода Construct Распорядителя.

12k Таких методов может быть и несколько — каждый из них определяет собственный ^^ способ создания итогового продукта, доступ к которому, тем не менее, всегда происходит через универсальный абстрактный интерфейс.

Допустим, у нас имеется класс MyProduct со строковым полем field, содержимое которого формируется последовательностью некоторых операций (например, обращением к базе данных и постепенным наращиванием строки символ за символом), причем эта последовательность зависит от конкретной реализации.

Добавим к проекту новый шаблон Builder (рис. 7.3).

Введем на диаграмму новый класс MyProduct с полем field, после чего свяжем этот класс с интерфейсом IProduct продукта Строителя.

MyProduct = class(TObject, IProduct) public var

field:string;

end;

Интерфейс Строителя расширим двумя методами BuildPartl и BuildPart2, которые станут последовательно создавать объект-продукт и расширять его поле field какими-то значениями.

Рис. 73. Шаблон Строитель в Дизайнере модели

IBuilder = interface

function GetResult: IProduct; procedure BuildPartl; procedure BuildPart2; end;

IProduct = interface end;

Эти методы реализуем в классе Конкретного строителя.

TConcreteBuilder = class(TObject, IBuilder) strict private var

FResultProduct:IProduct;

public

procedure BuildPartl; procedure BuildPart2;

///< i s subrout ine>True</is subrout ine> function GetResult: IProduct;

end;

// первый этап

procedure TConcreteBuilder.BuildPart1; begin

// создаем продукт

FResultProduct:= MyProduct.Create;

// начинаем формировать его содержимое:

MyProduct(FResultProduct).field := ‘a'; end;

// второй этап

procedure TConcreteBuilder.BuildPart2; begin

// продолжаем наращивать содержимое MyProduct(FResultProduct).field := MyProduct(FResultProduct).field + ‘b'; end;

// возвращаем продукт

function TConcreteBuilder.GetResult: IProduct; begin

Result := FResultProduct; end;

Класс Распорядителя составлен из двух методов: конструктора, в котором он получает интерфейс Строителя, и процедуры конструирования итогового продукта.

TDirector = class strict private var

///<link>aggregation</link> FBuilder:IBuilder;

public

///<issubroutine>True</issubroutine> procedure Construct;

constructor Create(ABuilder :IBuilder);

end;

Вот как может быть реализована процедура Construct — в ней последовательно вызываются два этапа формирования продукта.

procedure TDirector.Construct; begin

FBuilder.BuildPartl(); FBuilder.BuildPart2(); end;

Теперь к данным классам можно обращаться из прикладного кода, например, из обработчика нажатия на кнопку.

procedure TWinForm.Buttonl_Click(sender: System.Objept; e: System.EventArgs); var

Builder :TConcreteBuilder; Product :IProduct; begin

// создаем Конкретный строитель

Builder := TConcreteBuilder.Create();

// создаем Распорядитель, использующий Строителя // и сразу вызываем метод конструирования. // Таким образом удается обойтись без // введения локальной переменной для Распорядителя TDirector.Create(Builder).Construct();

// получаем объект-продукт

Product := Builder.GetResult();

// результатом будет строка "ab"

labell.Text := MyProduct(Product).field?

end;

Бобровский С. И. Технологии Delphi 2006. Новые возможности. — СПб.: Питер, 2006. — 288 е.: ил.

По теме:

  • Комментарии