
- •Оглавление
- •Вопросы к экзамену по дисциплине «дги. Шаблоны проектирования»
- •1 Adapter
- •3 Bridge
- •4 Decorator
- •5 Proxy, Composite Proxy
- •Composite
- •6. Lazy Initialization, Singleton lazy Initialization
- •Singleton
- •7 Object Pool
- •8 Prototype
- •9 Builder
- •10 Factory Method
- •11 Abstract Factory
- •12 Command
- •13 Strategy
- •14 Observer
- •15 Iterator
- •16 Chain of responsibility
- •17 Mediator
- •18 Template Method
- •19 Active Record
- •20 Unit of Work
- •21 Lazy load
- •22 Identity Map
- •23 Data Access Objects
Composite
Проблема Как обрабатывать группу или композицию структур обьектов одновременно?
Решение Определить классы для композитных и атомарных обьектов таким образом, чтобы они реализовывали один и тот же интерфейс.
Пример См. паттерн "Стратегия"
, необходимо учесть несколько скидок различных видов (зависят от времени, типа покупателя, типом выбранного продукта. Как применять политику ценообразования? Вырабатывается стратегия приоритета скидок, объект "Продажа" не должен обладать информацией о применяемых скидках, но можно было бы применить стратегию расчета скидок. Создается новый класс "РасчетСкидкиАлгоритмКомпозит".
6. Lazy Initialization, Singleton lazy Initialization
Приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат. Таким образом, инициализация выполняется «по требованию», а не заблаговременно. Аналогичная идея находит применение в самых разных областях: например, компиляция «на лету».
Частный случай ленивой инициализации — создание объекта в момент обращения к нему — является одним из порождающих шаблонов проектирования.
Достоинства
- Инициализация выполняется только в тех случаях, когда она действительно необходима;
- ускоряется начальная инициализация.
Недостатки
- Невозможно явным образом задать порядок инициализации объектов;
- возникает задержка при обращении к объекту.
Singleton
Проблема Какой специальный класс должен создавать "Абстрактную фабрику", и как получить к ней доступ? Необходим лишь один экземпляр специального класса, различные объекты должны обращаться к этому экземпляру через единственную точку доступа.
Решение Создать класс и определить статический метод класса, возвращающий этот единственный объект.
Рекомендации Разумнее создавать именно статический экземпляр специального класса, а не объявить требуемые методы статическими, поскольку при использовании методов экземпляра можно применить механизм наследования и создавать подклассы. Статические методы в языках программирования не полиморфны и не допускают перекрытия в производных классах.
Решение на основе создания экземпляра является более гибким, поскольку впоследствии может потребоваться уже не единственный экземпляр объекта, а несколько.
7 Object Pool
Пул объектов предназначен хранения готовых к использованию объектов. Когда системе требуется новый объект, он запрашивается из Пула, минуя процесс порождения. А после использования возвращается обратно в Пул вместо уничтожения. Шаблон применяется для повышения производительности, если:
объекты часто создаются и уничтожаются;
в системе существует ограниченное количество объектов типа, хранимого в Пуле;
создание и/или уничтожение объекта являются очень затратными операциями.
Пул объектов может работать как с интерфейсами, так и с конкретными реализациями. Все зависит от архитектуры разрабатываемой системы и решаемых задач. Можно встретить совместное использование Пула объектов и других порождающих шаблоном. Плохой практикой является сокрытие Пула за другими порождающими шаблонами. Разработчик, использующий такой "гибрид", не ожидает требования возврата объектов от, например, Фабричного метода. А без возврата объектов сам Пул становится бесполезным. В таком случае, правильным решением будет отделить реализацию классов, создающих объекты.
Особенности использования
Пул ничего не знает о реализации хранимых объектов. Поэтому возвращенный объект считается находящимся в неопределенном состоянии. Для дальнейшего использования его необходимо перевести в начальное состояние (сбросить). Наличие объектов в неопределенном состоянии превращает Пул в "объектную клоаку" (object cesspool).
Повторное использование может стать причиной утечки конфиденциальной информации. Поэтому необходимо обязательно очищать поля с секретными данными при сбросе, а сами данные – затирать или уничтожать.
Возможна ситуация, когда в Пуле не останется свободных объектов. В этом случае реакция на запрос может быть следующая:
увеличение размера пула;
отказ в выдачи объекта;
постановка в очередь и ожидание освобождения объекта.