Главная » Delphi » Delphi 2006 – Шаблон Flyweight (Приспособленец)

0

Приспособленец позволяет существенно повысить эффективность работы приложения в случае, когда задействовано большое число объектов, количество их внутренних состояний ограничено, а основной акцент сделан на функциональные возможности. В таком случае шаблон формирует небольшой набор объектов-состояний, а при создании новых объектов они просто заменяются ссылками на постоянно существующие копии, количество которых равно числу состояний.

Представим, что моделируется футбольная игра, где каждый футболист представлен в виде объекта со сложной логикой поведения, но число состояний которого равно всего двум (выступает за команду А или за команду Б), а вся остальная информация об игре, в том числе и координаты игроков, хранится во внешнем управляющем модуле. Тогда достаточно создавать не 22 объекта (И объектов команды А и И объектов команды Б), а всего два (игрок команды А и игрок команды Б). Внешний программный монитор получит доступ к ним через данный шаблон (рис. 7.12).

Созданием внутренних объектов, отражающих число возможных состояний, занимается класс Фабрика приспособленцев:

TFlyweightFactory = class strict private var

FTheTConcreteFlyweights: Hashtable;

public

function GetTConcreteFlyweight (AKey :TObject) : IFlyweight;

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

constructor Create;

end;

Реализация перечня объектов, отображающих возможные состояния, выполнена в данной версии шаблона в Delphi в виде хэш-таблицы — стандартного класса .NET System. Collections. Hashtabte.

Result := st; end;

С точки зрения внешнего пользователя всегда происходит обращение только к Фабрике объектов, через метод GetTConcreteFlyweight с параметром, отражающим состояние.

function TFlyweightFactory.GetTConcreteFlyweight (AKey : TObject): IFlyweight; var

newFlyweight :IFlyweight; begin

If FTheTConcreteFlyweights.ContainsKey(AKey) Then // если объект уже есть в хэш-таблице: begin

Result := IFlyweight(FTheTConcreteFlyweights[AKey]); end Else begin

// если объекта нет – создать новый:

newFlyweight := TConcreteFlyweight.Create(AKey); FTheTConcreteFlyweights.Add(AKey, newFlyweight); Result := newFlyweight; end; end;

В прикладном коде работа с данным шаблоном может выглядеть так.

var ff: TFlyweightFactory; ifly: IFlyweight; i: Integer;

ff:= TFlyweightFactory.Create;

for I := 1 to 10 do begin

// создаем формально десять, а фактически – пять объектов в хэше – при создании объектов, в конструкторах которых были указаны одинаковые значения параметра, Приспособленец выполнит подмену реальных объектов ссылками на готовый эталон:

ifly := ff.GetTConcreteFlyweight(TObject(i div 2));

labell.Text := ifly.SampleOperation; end;

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

По теме:

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