Особенности паттерна Flyweight
При использовании объектов на очень низких уровнях детализации накладные расходы могут быть непомерно большими. Использование паттерна Flyweight предполагает удаление неразделяемого состояния из класса и его передачу клиентом в вызываемые методы. И хотя это накладывает большую ответственность на клиента, но теперь создается значительно меньшее число объектов-приспособленцев. Совместное… Читать ещё >
Особенности паттерна Flyweight (реферат, курсовая, диплом, контрольная)
- · Если Flyweight показывает, как сделать множество небольших объектов, то Facade показывает, как представить целую подсистему одним объектом.
- · Flyweight часто используется совместно с Composite для реализации иерархической структуры в виде графа с разделяемыми листовыми вершинами.
- · Терминальные символы абстрактного синтаксического дерева Interpreter могут разделяться при помощи Flyweight.
- · Flyweight объясняет, когда и как могут разделяться объекты State.
Реализация паттерна Flyweight. Паттерн Flyweight: до и после
При использовании объектов на очень низких уровнях детализации накладные расходы могут быть непомерно большими. Использование паттерна Flyweight предполагает удаление неразделяемого состояния из класса и его передачу клиентом в вызываемые методы. И хотя это накладывает большую ответственность на клиента, но теперь создается значительно меньшее число объектов-приспособленцев. Совместное использование этих экземпляров облегчается с помощью класса-фабрики, поддерживающей «кэш» существующих приспособленцев.
В этом примере, «X» состояние рассматривается как разделяемое, а «Y» состояние выносится наружу (передается клиентом при вызове метода report ()).
До.
| class Gazillion. {. public: Gazillion (). {. m_value_one = s_num / Y; m_value_two = s_num % Y; ++s_num; }. void report (). {. cout << m_value_one << m_value_two << ' '; }. static int X, Y; private: int m_value_one; int m_value_two; static int s_num; }; int Gazillion: X = 6, Gazillion: Y = 10, Gazillion: s_num = 0; int main (). {. Gazillion matrix[Gazillion:X][Gazillion:Y]; for (int i = 0; i < Gazillion: X; ++i). {. for (int j = 0; j < Gazillion: Y; ++j). matrix[i][j]. report (); cout << ' '; }. }. |
Вывод программы:
|
|
После.
| class Gazillion. {. public: Gazillion (int value_one). {. m_value_one = value_one; cout << «ctor: «<< m_value_one << ' '; }. ~Gazillion (). {. cout << m_value_one << ' '; }. void report (int value_two). {. cout << m_value_one << value_two << ' '; }. private: int m_value_one; }; class Factory. {. public: static Gazillion *get_fly (int in). {. if (!s_pool[in]). s_pool[in] = new Gazillion (in); return s_pool[in]; }. static void clean_up (). {. cout << «dtors: «; for (int i = 0; i < X; ++i). if (s_pool[i]). delete s_pool[i]; cout << ' '; }. static int X, Y; private: static Gazillion *s_pool[]; }; int Factory: X = 6, Factory: Y = 10; Gazillion *Factory:s_pool[] =. {. 0, 0, 0, 0, 0, 0. }; int main (). {. for (int i = 0; i < Factory: X; ++i). {. for (int j = 0; j < Factory: Y; ++j). Factory:get_fly (i)->report (j); cout << ' '; }. Factory:clean_up (); }. |
проектирование паттерн графический Вывод программы:
| ctor: 0. 00 01 02 03 04 05 06 07 08 09. ctor: 1. 10 11 12 13 14 15 16 17 18 19. ctor: 2. 20 21 22 23 24 25 26 27 28 29. ctor: 3. 30 31 32 33 34 35 36 37 38 39. ctor: 4. 40 41 42 43 44 45 46 47 48 49. ctor: 5. 50 51 52 53 54 55 56 57 58 59. dtors: 0 1 2 3 4 5. |