Мегаобучалка Главная | О нас | Обратная связь


Классическая реализация паттерна Factory Method



2016-09-17 371 Обсуждений (0)
Классическая реализация паттерна Factory Method 0.00 из 5.00 0 оценок




// #include <iostream> #include <vector>   // Иерархия классов игровых персонажей class Warrior { public: virtual void info() = 0; virtual ~Warrior() {} };   class Infantryman: public Warrior { public: void info() { cout << "Infantryman" << endl; }; };   class Archer: public Warrior { public: void info() { cout << "Archer" << endl; }; };   class Horseman: public Warrior { public: void info() { cout << "Horseman" << endl; }; };     // Фабрики объектов class Factory { public: virtual Warrior* createWarrior() = 0; virtual ~Factory() {} };   class InfantryFactory: public Factory { public: Warrior* createWarrior() { return new Infantryman; } };   class ArchersFactory: public Factory { public: Warrior* createWarrior() { return new Archer; } };   class CavalryFactory: public Factory { public: Warrior* createWarrior() { return new Horseman; } };     // Создание объектов при помощи фабрик объектов int main() { InfantryFactory* infantry_factory = new InfantryFactory; ArchersFactory* archers_factory = new ArchersFactory ; CavalryFactory* cavalry_factory = new CavalryFactory ;   vector<Warrior*> v; v.push_back( infantry_factory->createWarrior()); v.push_back( archers_factory->createWarrior()); v.push_back( cavalry_factory->createWarrior());   for(int i=0; i<v.size(); i++) v[i]->info(); // ... }

Классический вариант паттерна Factory Method использует идею полиморфной фабрики. Специально выделенный для создания объектов полиморфный базовый класс Factory объявляет интерфейс фабричного метода createWarrior(), а производные классы его реализуют.

Паттерн Observer (наблюдатель, издатель-подписчик)

Назначение паттерна Observer

· Паттерн Observer определяет зависимость "один-ко-многим" между объектами так, что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически.

· Паттерн Observer инкапсулирует главный (независимый) компонент в абстракцию Subject и изменяемые (зависимые) компоненты в иерархию Observer.

· Паттерн Observer определяет часть "View" в модели Model-View-Controller (MVC) .

Паттерн Observer находит широкое применение в системах пользовательского интерфейса, в которых данные и их представления ("виды") отделены друг от друга. При изменении данных должны быть изменены все представления этих данных (например, в виде таблицы, графика и диаграммы).

Решаемая проблема

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

Обсуждение паттерна Observer

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

Такая схема позволяет динамически настраивать количество и "типы" представлений объектов.

Описанный выше протокол взаимодействия соответствует модели вытягивания (pull), когда субъект информирует наблюдателей о своем изменении, и каждый наблюдатель ответственен за "вытягивание" у Subject нужных ему данных. Существует также модель проталкивания, когда субъект Subject посылает ("проталкивает") наблюдателям детальную информацию о своем изменении.

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

· Реализация "компрессии" извещений (посылка единственного извещения на серию последовательных изменений субъекта Subject).

· Мониторинг нескольких субъектов с помощью одного наблюдателя Observer.

· Исключение висячих ссылок у наблюдателей на удаленные субъекты. Для этого субъект должен уведомить наблюдателей о своем удалении.

Паттерн Observer впервые был применен в архитектуре Model-View-Controller языка Smalltalk, представляющей каркас для построения пользовательских интерфейсов.

Структура паттерна Observer

Subject представляет главную (независимую) абстракцию. Observer представляет изменяемую (зависимую) абстракцию. Субъект извещает наблюдателей о своем изменении, на что каждый наблюдатель может запросить состояние субъекта.



2016-09-17 371 Обсуждений (0)
Классическая реализация паттерна Factory Method 0.00 из 5.00 0 оценок









Обсуждение в статье: Классическая реализация паттерна Factory Method

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (371)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)