Паттерн flyweight (приспособленец)
Изучение приёмов объектно-ориентированного проектирования. Описание, назначение и применение паттерна flyweight. Графическое представление взаимодействия между объектами. Реализация иерархической структуры в виде графа с разделяемыми листовыми вершинами.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 17.04.2015 |
Размер файла | 106,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://allbest.ru
МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«Ижевский государственный технический университет имени М.Т. Калашникова» (ФГБОУ ВПО «ИжГТУ имени М.Т. Калашникова»)
Факультет «Информатика и вычислительная техника»
Кафедра «Программное обеспечение»
Лабораторная работа
По дисциплине «Система автоматизированного проектирования программного обеспечения»
На тему «Паттерн flyweight (приспособленец)»
Выполнил: студент группы 19-1з
_______________ Санников П.В.
Проверил: преподаватель
_______________ Старыгина Е.В.
Ижевск 2015
Постановка задачи
1. Выбрать один или несколько паттернов.
2. Продемонстрировать его применение в виде программного кода.
3. В отчете обязательно привести теоретическое описание паттерна, графическое представление взаимодействия между объектами и классами объектов.
Назначение паттерна Flyweight
· Паттерн Flyweight использует разделение для эффективной поддержки большого числа мелких объектов.
· Является стратегией Motif GUI для замены "тяжеловесных" виджетов "легковесными" гаджетами.
Motif-библиотека для разработки приложений c графическим интерфейсом под X Window System. Появилась в конце 1980-х и на данный момент считается устаревшей.
В Motif элементы графического интерфейса (кнопки, полосы прокрутки, меню и т.д.) строятся на основе виджетов. Каждый виджет имеет свое окно.
Исторически окна считаются "тяжеловесными" объектами. Если приложение с графическим интерфейсом использует множество виджетов, то производительность системы может упасть. Для решения этой проблемы в Motif предусмотрены гаджеты, являющиеся безоконными аналогами виджетов. Гаджеты управляются менеджерами виджетов, использующих схему "parent-children".
Решаемая проблема
Проектирование системы из объектов самого низкого уровня обеспечивает оптимальную гибкость, но может быть неприемлемо "дорогим" решением с точки зрения производительности и расхода памяти.
Обсуждение паттерна Flyweight
Паттерн Flyweight описывает, как совместно разделять очень мелкие объекты без чрезмерно высоких издержек. Каждый объект-приспособленец имеет две части: внутреннее и внешнее состояния. Внутреннее состояние хранится (разделяется) в приспособленце и состоит из информации, не зависящей от его контекста. Внешнее состояние хранится или вычисляется объектами-клиентами и передается приспособленцу при вызове его методов.
Замена Motif-виджетов "легковесными" гаджетами иллюстрирует этот подход. Если виджет являются достаточно самостоятельным элементом, то гаджет находится в зависимости от своего родительского менеджера компоновки виджетов. Каждый менеджер предоставляет своим гаджетам контекстно-зависимую информацию по обработке событий, ресурсам. Гаджет хранит в себе только контекстно-независимые данные.
Структура паттерна Flyweight
Клиенты не создают приспособленцев напрямую, а запрашивают их у фабрики. Любые атрибуты (члены данных класса), которые не могут разделяться, являются внешним состоянием. Внешнее состояние передается приспособленцу при вызове его методов. При этом наибольшая экономия памяти достигается в том случае, если внешнее состояние не хранится, а вычисляется при вызове.
UML-диаграмма классов паттерна Flyweight
Классы, описывающие различных насекомых Ant, Locust и Cockroach могут быть "легковесными", потому что специфичная для экземпляров информация может быть вынесена наружу и затем, передаваться клиентом в запросе.
Пример паттерна Flyweight
Паттерн Flyweight использует разделение для эффективной поддержки большого числа мелких объектов. Телефонная сеть общего пользования ТФОП является примером Flyweight. Т
акие ресурсы как генераторы тональных сигналов (Занято, КПВ и т.д.), приемники цифр номера абонента, набираемого в тоновом наборе, являются общими для всех абонентов. Когда абонент поднимает трубку, чтобы позвонить, ему предоставляется доступ ко всем нужным разделяемым ресурсам.
Использование паттерна Flyweight
· Убедитесь, что существует проблема повышенных накладных расходов.
· Разделите состояние целевого класса на разделяемое (внутреннее) и неразделяемое (внешнее).
· Удалите из атрибутов (членов данных) класса неразделяемое состояние и добавьте его в список аргументов, передаваемых методам.
· Создайте фабрику, которая может кэшировать и повторно использовать существующие экземпляры класса.
· Для создания новых объектов клиент использует эту фабрику вместо оператора new.
· Клиент (или третья сторона) должен находить или вычислять неразделяемое состояние и передавать его методам класса.
Особенности паттерна Flyweight
· Если Flyweight показывает, как сделать множество небольших объектов, то Facade показывает, как представить целую подсистему одним объектом.
· Flyweight часто используется совместно с Composite для реализации иерархической структуры в виде графа с разделяемыми листовыми вершинами.
· Терминальные символы абстрактного синтаксического дерева Interpreter могут разделяться при помощи Flyweight.
· Flyweight объясняет, когда и как могут разделяться объекты State.
Реализация паттерна Flyweight. Паттерн Flyweight: до и после
При использовании объектов на очень низких уровнях детализации накладные расходы могут быть непомерно большими. Использование паттерна Flyweight предполагает удаление неразделяемого состояния из класса и его передачу клиентом в вызываемые методы. И хотя это накладывает большую ответственность на клиента, но теперь создается значительно меньшее число объектов-приспособленцев. Совместное использование этих экземпляров облегчается с помощью класса-фабрики, поддерживающей "кэш" существующих приспособленцев.
В этом примере, "X" состояние рассматривается как разделяемое, а "Y" состояние выносится наружу (передается клиентом при вызове метода report()).
До
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 |
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 << '\n'; } } |
Вывод программы:
1 2 3 4 5 6 |
00 01 02 03 04 05 06 07 08 09 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 |
После
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 |
class Gazillion { public: Gazillion(int value_one) { m_value_one = value_one; cout << "ctor: " << m_value_one << '\n'; } ~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 << '\n'; } 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 << '\n'; } Factory::clean_up(); } |
проектирование паттерн графический
Вывод программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 |
ЛИТЕРАТУРА
1. K. Alexander et al. Pattern Language. Oxford 1977.
2. К. Ларман. Применение UML и паттернов проектирования. М. , Вильямс, 2002.
3. Г. Буч, Дж. Рамбо, А. Джекобсон. Язык UML. Руководство пользователя. М. LVR Пресс, 2001.
4. Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приемы обьектно - ориентированного проектирования Паттерны Проектирования. СПб., Питер, 2003.
5. М. Фаулер. Архитектура корпоративных программных приложений. М. , Вильямс, 2004.
6. G. Hohpe, B. Woolf. Enterprise Integration Patterns : Designing, Building, and Deploying Messaging Solutions. Addison-Wesley, 2004.
Размещено на Allbest.ru
...Подобные документы
Исследование приемов объектно-ориентированного проектирования. Описания паттернов поведения, предназначенных для распределения обязанностей между объектами в системе. Признаки применения, использования паттерна "Декоратор". Принцип действия репозитория.
реферат [686,9 K], добавлен 21.09.2013Описание проектного решения стратегической системы, этапы объектно-ориентированного анализа и проектирования. Описание связей между объектами. Программная реализация, построение модели состояний объекта. Руководство пользователя и описание программы.
курсовая работа [388,8 K], добавлен 17.11.2011Работа с компонентами в Zend Framework. Структура директорий, модели, представления, контроллеры, модули, маршруты. Взаимодействие между компонентами. Работа с формами и моделями объектно-ориентированного фреймворка. Паттерн Data Mapper, особенности.
курсовая работа [600,8 K], добавлен 12.01.2016Основные типичные системы управления базами данных. Способы описания взаимодействий между объектами и атрибутами. Структурная и управляющая части иерархической модели базы данных. Представление связей, операции над данными в иерархической модели.
реферат [30,5 K], добавлен 22.02.2011Особенности реализации главных элементов разрабатываемой программы (цифровые элементы) с помощью объектно-ориентированного подхода. Применение принципа инкапсуляции для защиты данных. Конструирование классов, описание и тестирование программного продукта.
курсовая работа [2,3 M], добавлен 10.05.2015Основные типы шаблонов проектирования. Типы связей, которые могут применяться при объектно-ориентированном программировании. Обзор и реализация порождающих, структурных и поведенческих шаблонов проектирования. Шаблоны "Command", "Front Controller".
курсовая работа [3,1 M], добавлен 01.06.2014Особенности объектно-ориентированного проектирования. Основные понятия объектно-ориентированного подхода. Основы языка UML, варианты его использования. Диаграммы классов и взаимодействия. Разработка диаграммы прецедентов (вариантов использования).
курсовая работа [1,1 M], добавлен 13.05.2014Основные методы объектно-ориентированного программирования поисковой системы. Выбор языка программирования и среды разработки приложения. Реализация паттерна, использование принципа сохраняемости. Описание пользовательского интерфейса поисковой системы.
курсовая работа [781,4 K], добавлен 29.04.2015Технологии программирования. Сущность объектно-ориентированного подхода к программированию. Назначение Си, исторические сведения. Алфавит, базовые типы и описание данных. Структуры и объединения. Операторы Си++. Функции. Библиотека времени выполнения.
курс лекций [51,9 K], добавлен 03.10.2008Понятие объектно-ориентированного программирования, характеристика используемых языков. Практическая разработка средств объектно-ориентированного программирования в задачах защиты информации: программная реализация на языке С++, а также Turbo Pascal.
курсовая работа [275,9 K], добавлен 22.12.2011Использование объектно-ориентированного программирования - хорошее решение при разработке крупных программных проектов. Объект и класс как основа объектно-ориентированного языка. Понятие объектно-ориентированных языков. Языки и программное окружение.
контрольная работа [60,1 K], добавлен 17.01.2011Освоение методики проектирования программных комплексов на базе объектно-ориентированного программирования. Описание понятий класс, конструктор и деструктор, наследование простое и множественное. Реализация объектной модели на языке программирования с++.
курсовая работа [468,5 K], добавлен 11.12.2011Основные элементы объектной модели. Сущность и преимущества объектно-ориентированного подхода, понятие объекта и класса. Унифицированный язык моделирования UML. Диаграммы классов и взаимодействия: назначение, построение и примеры использования.
реферат [273,2 K], добавлен 09.06.2009Понятие о классах и объектах, их место и значение в современном программировании. История развития унифицированного языка моделирования, достижения в данной области на сегодня. Методы представления класса. Представление отношения между классами.
реферат [515,6 K], добавлен 25.01.2011Унифицированный язык моделирования. Методы объектно-ориентированного анализа и проектирования. Создание диаграммы последовательности и диаграммы сотрудничества. Главная диаграмма классов. Добавление связей между классами. Зависимость между пакетами.
курсовая работа [2,7 M], добавлен 23.06.2011Изучение базовых понятий объектно-ориентированного программирования. Исследование принципов работы с классами и объектами. Построение системы классов для описания плоских геометрических фигур. Анализ методов создания объектов, перемещения на плоскости.
лабораторная работа [212,0 K], добавлен 10.03.2013Применение объектно-ориентированного программирования для написания нескольких модулей программы. Вычисление алгебраического уравнения методом половинного деления. Применение метода Эйлера в теории численных методов общих дифференциальных уравнений.
курсовая работа [398,1 K], добавлен 26.02.2015Причины возникновения объектно-ориентированного программирования. Графическое представление классов; их отличия от других абстрактных типов данных. Типы абстракции, используемые при построении объекта. Сущность инкапсуляции, наследования и полиморфизма.
контрольная работа [222,1 K], добавлен 04.06.2014Разработка приложения для работы с базой данных, с использованием объектно-ориентированного и визуального программирования. Проектирование физической структуры базы данных. Программная реализация, процесс взаимодействия пользователя с приложениями.
курсовая работа [1,5 M], добавлен 31.01.2016Описание процедуры выбора структуры хранения данных. Программная реализация одномерного неоднородного массива. Представление бинарного дерева в виде динамической структуры данных. Изучение способов поиска в упорядоченном дереве. Содержание базы данных.
практическая работа [850,0 K], добавлен 16.04.2015