|
Программирование >> Многопоточная библиотека с принципом минимализма
в классе 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.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |