Анимация
JavaScript
|
Главная Библионтека • в классе 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 |