Паттерн 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.