- •« Шаблоны проектирования» (5 курс, 9 семестр, 2011–2012 учебный год)
- •1 Понятие шаблона проектирования. Средства описания шаблонов проектирования.
- •2 История развития шаблонов проектирования. Классификация шаблонов проектирования.
- •12 Структурные шаблоны. Adapter
- •13 Cтруктурные шаблоны. Facade
- •14 Структурные Шаблоны. Bridge
- •15 Структурные Шаблоны. Decorator
- •16 Структурные Шаблоны. Proxy, Composite
- •23 Поведенческие Шаблоны. Command
- •24 Поведенческие Шаблоны. Strategy
- •25 Поведенческие Шаблоны. Observer
- •26 Поведенческие Шаблоны. Iterator
- •27 Поведенческие Шаблоны. Chain Of Responsibility
- •28 Поведенческие Шаблоны. Mediator
- •29 Поведенческие Шаблоны. Template Method
- •30 Архитектурные шаблоны. Классификация
- •31 Архитектурные шаблоны. Клиент-серверные системы
- •32 Архитектурные шаблоны. Многоуровневые системы
- •33 Архитектурные шаблоны. Репозиторий
- •34 Архитектурные шаблоны. Поток данных
- •35 Архитектурные шаблоны. Централизованное управление Вызов - возврат (сценарий транзакции - частный случай).
- •Диспетчер
- •36 Архитектурные шаблоны. Управление, основанное на событиях Передача сообщений
- •Управляемый прерываниями
- •37 Архитектурные шаблоны. Active Record
- •38 Архитектурные шаблоны. Unit of Work
- •39 Архитектурные шаблоны. Lazy Load
- •40 Архитектурные шаблоны. Identity Map
- •41 Архитектурные шаблоны. Data Access Object
- •42 Шаблоны проектирования пользовательского интерфейса. Model-View-Controller
- •43 Шаблоны проектирования пользовательского интерфейса. Document-View
- •44 Шаблоны проектирования пользовательского интерфейса. Model-View-Presenter
- •45 Шаблоны проектирования пользовательского интерфейса. Model-View-ViewModel
- •Назначение
- •Использование
- •Описание
- •46 Антишаблоны
39 Архитектурные шаблоны. Lazy Load
Задача Требуется загрузить данные из базы данных в оперативную память так, чтобы при загрузке требуемого объекта автоматически загружались и другие связанные с ним объекты, при этом, объем загружаемых данных не должен быть чрезмерным.
Решение Прерывать процесс загрузки связанных объектов из базы данных, оставляя при этом соответствующую метку. Это позволит загрузить данные только тогда, когда они действительно потребуются.
Паттерн Lazy Load (Ленивая Загрузка) подразумевает отказ от загрузки дополнительных данных, когда в этом нет необходимости. Вместо этого ставится маркер о том, что данные не загружены и их надо загрузить в случае, если они понадобятся. Как известно, если Вы ленивы, то вы выигрываете в том случае, если дело, которое вы не делали на самом деле и не надо было делать.
Существует четыре основных варианта ленивой загрузки.
Lazy Initialization (Ленивая Инициализация) использует специальный макер (обычно null), чтобы пометить поле, как не загруженное. При каждом обращении к полю проверяется значение маркера и, если значение поля не загружено - оно загружается.
Virtual Proxy (Виртуальный Прокси) - объект с таким же интерфейсом, как и настоящий объект. При первом обращении к методу объекта, виртуальный прокси загружает настоящий объект и перенаправляет выполнение.
Value Holder (Контейнер значения) - объект с методом getValue. Клиент вызывает метод getValue, чтобы получить реальный объект. getValue вызывает загрузку.
Ghost (Призрак) - объект без каких-либо данных. При первом обращении к его методу, призрак загружает все данные сразу.
40 Архитектурные шаблоны. Identity Map
Задача Требуется гарантировать, что каждый объект будет загружен из базы данных только один раз.
Решение Создать специальную коллекцию обьектов, загруженных из базы данных в пределах одной бизнес - транзакции. Таким образом, при получении запроса можно просмотреть эту коллекцию в поисках нужного объекта.
Предотвращение повторных загрузок позволяет избежать ошибок и повышает производительность системы.
Одна старая пословица постулирует, что человек с двумя часами никогда не знает, сколько сейчас времени. И если уж двое часов вносят путаницу, то с загрузкой объектов из БД может получиться гораздо большая путаница. Если разработчик не достаточно аккуратен, может получиться, что он загрузит данные из БД в два объекта. Потом, когда он сохранит их, получится путаница и конкуренция различных данных.
Более того, с этим связаны проблемы производительности. Когда дважды загружается одна и та же информация, увеличиваются затраты на передачу данных. Таким образом, загрузка одних и тех же данных дважды не только обеспечивает корректность информации, но и ускоряет работу приложения.
Паттерн Identity Map (Карта присутствия / Карта соответствия) хранит записи о всех объектах, которые были считаны из БД за время выполнения одного действия. Когда происходит обращение к объекту, проверяется карта соответствия (присутствия), чтобы узнать, загружен ли объект.