Главная » Delphi » Delphi 2006 – Шаблон Prototype (Прототип)

0

В ряде проектов возникает необходимость создания множества объектов — экземпляров не очень большого числа классов, каждый из которых требует предварительной и довольно объемной настройки. Такую настройку можно выполнять вручную, а можно заранее подготовить набор объектов-прототи- пов — по одному на каждый класс — и при необходимости просто создавать их копии-клоны (рис. 7.5).

Данный шаблон решает эту проблему, предоставляя единый интерфейс клонирования: I Prototype.

Рис. 7.5. Шаблон Прототип в Дизайнере модели

type

IPrototype = interface

function Clone: IPrototype;

end;

В соответствии с шаблоном прикладной программе достаточно обратиться к методу clone любого объекта, чтобы тут же получить его настроенную копию со всеми настроенными (текущими) значениями полей.

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

TConcretePrototype = class(TObject, IPrototype) strict protected

constructor Create(APrototype -.TConcretePrototype) ; overload;

public

constructor Create;overload; var

field:string;

function Clone: IPrototype;

end;

TConcretePrototype2 = class(TObject, IPrototype) public

constructor Create;overload;

var

field:integer?

function Clone: IPrototype;

strict protected

constructor Create(APrototype :TConcretePrototype2); overload; end;

В конструкторах выполняется некая дополнительная настройка свойств.

constructor TConcretePrototype.Create (APrototype : TConcretePrototype); begin

inherited Create; field := ‘CP'; end;

constructor TConcretePrototype2.Create (APrototype : TConcretePrototype2); begin

inherited Create; field := 50; end;

Клонирование осуществляется в конструкторе, которому передается копия самого вызывающего объекта.

function TConcretePrototype.Clone: IPrototype; begin

Result := TConcretePrototype.Create(self); end;

function TConcretePrototype2.Clone: IPrototype; begin

Result := TConcretePrototype2.Create(self); end;

Теперь на базе этих классов в прикладной программе надо создать первые экземпляры, которые и будут впоследствии клонироваться.

var IC1, IC2: IPrototype;

// создаем по одному прототипу каждого класса: IC1 := TConcretePrototype.Create(); IC2 := TConcretePrototype2.Create();

// теперь на их основе можно строить произвольные схемы клонирования:

label1.Text := TConcretePrototype(IC1.Clone).field.ToString + TConcretePrototype2(IC2.Clone).field.ToString;

Обращением к методу Clone мы формируем копию нужного экземпляра класса и затем сразу передаем ее в качестве конструктора. Работа при этом ведется на уровне интерфейса I Prototype.

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

По теме:

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