Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [ 73 ] 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

• в классе Factory реализуются следующие примитивы.

bool RegisterCconst identifierType*, Productcreator creator);

Эта функция регистрирует производитель изделия вместе с идентификатором типа. Если регистрация прошла успешно, она возвращает значение true, в противном случае возвращается значение f al se (если производитель изделия с тем же идентификатором типа уже зарегистрирован ранее).

bool ungeristeredCconst IdentifierType* id);

Эта функция аннулирует регистрацию идентификатора заданного типа. Если этот идентификатор был зарегистрирован ранее, функция возвращает значение true.

AbstractProduct* CreateObjectCconst IdentifierType* id);

Эта функция выполняет поиск идентификатора типа во внутреннем ассоциативном массиве. Если идентификатор найден, она вызывает соответствующий производитель объектов данного типа и возвращает результат его работы. Если идентификатор не найден, возвращается результат работы функции FactoгуЕг-rorPolicy<ldentifierType, AbstractProduct>::OnunknownType. По умолчанию реализация класса FactoryErrorpolicy генерирует исключительную ситуацию вложенного типа Exception.

8.11. Краткий обзор шаблонного класса CloneFactory

• Объявление класса CloneFactory имеет следующий вид.

template <

class AbstractProduct, class Productcreator =

AbstractProduct* C*)Cconst AbstractProduct*), tempiate<typename, class>

class FactoryErrorpolicy = DefaultFactoryError

>

class CloneFactory;

• Класс AbstractProduct является базовым классом иерархии, для которой создается фабрика клонирования.

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

• В классе CloneFactory реализуются следующие примитивы.

bool RegisterCconst Typelnfo*, Productcreator creator);

Эта функция регистрирует производитель изделия вместе с типом Typelnfo (что позволяет неявно вызывать конструктор копирования класса std: :type info). Если регистрация прошла успешно, она возвращает значение true, в противном случае возвращается значение false.

bool UngeristeredCconst Typelnfo* typeinfo);

Эта функция аннулирует регистрацию производителя объектов заданного типа. Если этот тип был зарегистрирован ранее, функция возвращает значение true.

AbstractProduct* CreateObjectCconst AbstractProduct* model); 236 Часть II. Компоненты



Эта функция выполняет поиск динамического типа объекта model во внутреннем ассоциативном массиве. Обнаружив тип, она вызывает соответствующий производитель объектов данного типа и возвращает результат его работы. Если тип не найден, возвращается результат работы функции FactoryErrorPol-icy<OrderedTypeinfo, AbstractProduct>::OnunknownType.



Шаблон Abstract Factory

в этой главе обсуждается обобщенная реализация щаблона проектирования Abstract Factory (Gamma et al., 1995). Абстрактная фабрика - это интерфейс для создания семейства связанных или взаимозависимых объектов.

Абстрактные фабрики могут бытъ важными архитектурными компонентами, поскольку они гарантируют, что в системе создаются правильные конкретные объекты. Если вы не хотите, чтобы кнопка FunkyButton появлялась в диалоговом окне Conven-tionalDialog, используйте щаблон проектирования Abstract Factory, гарантирующий, что эта кнопка появляется только в окне FunkyDialog. Для этого нужно проконтролировать лищь небольшую часть кода, а остальная часть приложения будет работать с абстрактными типами Dialog и Button.

В главе рассматриваются следующие вопросы.

• Область применения шаблона проектирования Abstract Factory.

• Определение и реализация компонентов шаблона Abstract Factory.

• Использование обобщенных функциональных возможностей шаблона Abstract Factory, предоставленных библиотекой Loki, и их расширение.

9.1. Архитектурная роль шаблона Abstract Factory

Представьте себе, что вы разрабатываете компьютерную ифу "найти и уничтожить" наподобие Doom или Quake.

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

Более крутых игроков вы соблазняете уровнем повышенной сложности. На этом уровне вражеские солдаты совершают три выстрела в секунду и владеют приемами карате, монстры коварны и вероломны, а супермонстры встречаются постоянно.

Возможная модель этого ужасного мира, населенного врагами и монстрами, может содержать базовый класс Enemy и производные от него интерфейсы Soldier, Monster и SuperMonster. Затем на основе этих интерфейсов для реализации легкого уровня ифы создаются производные классы sillySoldier, sillyMonster и SillySuperMon-ster. В заключение для уровня повышенной сложности реализуются классы BadSol-dier, BadMonster и BadSuperMonster. В результате возникает иерархия классов, представленная на рис. 9.1.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [ 73 ] 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105