Анимация
JavaScript
|
Главная Библионтека Итак, дуэт классов AbstractFactory/ConcreteFactory предоставляет нам следующие возможности. • Легко определять фабрики с помощью списков типов. • Поскольку класс AbstractFactory наследует каждый из своих компонентов, его интерфейс обладает высокой модульностью. Отдельные указатели или ссылки на подобъекты класса AFUnit<T> можно передавать разным модулям, уменьшая общую взаимозависимость классов. • Для реализации класса AbstractFactory можно применить класс Concrete-Factory, используя стратегию, диктующую метод создания объектов. Статически связанным стратегиям создания объектов (таким как класс OpNewFactoryunit, использующий оператор new) нужно передавать список конкретных изделий, создаваемых фабрикой. • Наиболее распространенной стратегией создания объектов является щаблон проектирования Prototype. Эту стратегию можно легко реализовать в классе ConcreteFactory с помощью щаблонного класса PrototypeFactoryUni t. Попробуйте получить все перечисленные выше преимущества, реализовав шаблон проектирования Abstract Factory вручную. 9.5. Резюме Шаблон проектирования Abstract Factory - интерфейс для создания семейства связанных или взаимозависимых полиморфных объектов. Используя этот шаблон, можно разделить классы реализации на разные непересекающиеся семейства. Интерфейс обобщенной абстрактной фабрики можно реализовать с помощью списков типов и шаблонных стратегий. Списки типов предусматривают списки изделий (конкретных и абстрактных) и шаблонные стратегии. Шаблонный класс AbstractFactory представляет собой скелет для определения абстрактных фабрик в сочетании с шаблонным классом AFUnit. Класс AbstractFactory использует класс GenScatterHierarchy (глава 3) для генерирования модульного интерфейса, наследующего класс AFUnit<T> для каждого абстрактного изделия Т, указанного в списке типов. Эта структура позволяет уменьшить взаимозависимость классов, передавая в различные части приложения только отдельные модули фабрик. Шаблон ConcreteFactory позволяет реализовать интерфейс класса AbstractFactory. Класс ConcreteFactory использует для создания объектов стратегию Facto-ryunit и класс GenLinearHierarchy (глава 3). В библиотеке Loki предусмотрены две реализации стратегии Factoryunit: класс OnNewFactoryUnit, создающий объекты с помощью оператора new, и класс PrototypeFactoryUnit, создающий объекты с помощью клонирования прототипов. 9.6. Краткий обзор классов AbstractFactory и ConcreteFactory • Объявление класса AbstractFactory выглядит следующим образом. template < class TList, template <class> class unit = AbstractFactoryunit > class AbstractFactory; Здесь класс TList является списком типов, состоящим из абстрактных изделий, создаваемых фабрикой, а класс Unit - это шаблон, определяющий интерфейс каждого типа из списка TList. Например, приведенное ниже выражение определяет абстрактную фабрику, способную клонировать объекты классов Soldier, Monster и SuperMonster. typedef AbstractFactory<TiPELlST 3(Soldier, Monster, SuperMonster> AbstractEnemyFactory; Класс AbstractFactoryUnit<T> определяет интерфейс, состоящий из чисто виртуальных функций, имеющих сигнатуру т* DoCreate(Type2Type<Type>). Обычно функцию DoCreate не нужно вызывать явно. Вместо нее вызывается функция AbstractFactory: :Create. Класс AbstractFactory содержит шаблонную функцию Create, которую можно конкретизировать для любого из типов абстрактных изделий. AbstractEnemyFactory *pFactory = ...; Soldier *pSoldier = pFactory->Create<Soldier>(); Для реализации интерфейса, определенного классом AbstractFactory, библиотека Loki содержит шаблонный класс ConcreteFactory. template < class AbstractFact, template <class, class> class Factoryunit = OpNewFactoryunit, class TList = AbstractFact::ProductList > class ConcreteFactory; Здесь класс AbstractFact представляет собой конкретизацию класса Abstract-Factory, подлежащего реализации. Класс Factoryunit является реализацией стратегии Factoryunit, а класс TList - это список конкретных изделий. Класс Factoryunit имеет доступ к абстрактному и конкретному изделиям, подлежащим созданию. В библиотеке Loki определены две стратегии Creator; классы OpNewFactoryunit (раздел 9.3) и PrototypeFactoryunit (раздел 9.4). Их можно использовать для настраиваемой реализации стратегии Factorunit. Класс OpNewFactoryunit использует для создания объектов оператор new. Применяя этот класс, нужно передавать список типов, состоящий из типов конкретных изделий, в качестве третьего шаблонного параметра класса ConcreteFactory. typedef ConcreteFactory < AbstractEnemyFactory, OpNewFactoryunit, TYPELIST 3(SillySoldier, sillyMonster, SillySuperMonster) > EasyLevelEnemyFactory; Класс PrototypeFactoryUni t хранит указатели на типы абстрактных изделий и создает новые объекты, вызывая функцию-член Clone с соответствующими параметрами. Для этого в классе PrototypeFactoryUnit для каждого абстрактного изделия т нужно определить отдельную виртуальную функцию Clone, возвращающую указатель типа т* и дублирующую объект. При использовании класса PrototypeFactoryUnit в сочетании с классом ConcreteFactory третий шаблонный аргумент класса ConcreteFactory не нужен. typedef ConcreteFactory < AbstractEnemyFactory, PrototypeFactoryUni t > EnemyProduct; 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 |