Поиск по сайту

 

Паттерны » Порождающие паттерны » Object Pool

Паттерн Object Pool (пул объектов)

Назначение паттерна Object Pool

Применение паттерна Object Pool может значительно повысить производительность системы; его использование наиболее эффективно в ситуациях, когда создание экземпляров некоторого класса требует больших затрат, объекты в системе создаются часто, но число создаваемых объектов в единицу времени ограничено.

Решаемая проблема

Пулы объектов (известны также как пулы ресурсов) используются для управления кэшированием объектов. Клиент, имеющий доступ к пулу объектов может избежать создания новых объектов, просто запрашивая в пуле уже созданный экземпляр. Пул объектов может быть растущим, когда при отсутствии свободных создаются новые объекты или c ограничением количества создаваемых объектов.

Желательно, чтобы все многократно используемые объекты, свободные в некоторый момент времени, хранились в одном и том же пуле объектов. Тогда ими можно управлять на основе единой политики. Для этого класс Object Pool проектируется с помощью паттерна Singleton.

Обсуждение паттерна Object Pool

Процессы запрашивают объекты из пула объектов. Когда эти объекты больше не нужны, они возвращаются в пул для дальнейшего повторного использования.

Если при очередном запросе все объекты пула заняты, то процесс будет ожидать освобождения объекта. Для исключения подобной ситуации пул объектов должен уметь создавать новые объекты по мере необходимости. При этом он также должен реализовывать механизм периодической очистки неиспользуемых объектов.

Структура паттерна Object Pool

Основная идея паттерна Object Pool состоит в том, чтобы избежать создания новых экземпляров класса в случае возможности их повторного использования.

UML-диаграмма классов паттерна Object Pool

UML-диаграмма классов паттерна Object Pool
  • Reusable - экземпляры классов в этой роли взаимодействуют с другими объектами в течение ограниченного времени, а затем они больше не нужны для этого взаимодействия.
  • Client - экземпляры классов в этой роли используют объекты Reusable.
  • ReusablePool - экземпляры классов в этой роли управляют объектами Reusable для использования объектами Client.

Как правило, желательно хранить все объекты Reusable в одном и том же пуле объектов. Это дает возможность управлять ими на основе единой политики. Для этого класс ReusablePool проектируется как Singleton. Его конструкторы объявляются как private, поэтому единственный экземпляр класса ReusablePool доступен другим классам только через метод getInstance().

Клиент запрашивает объект Reusable через метод acquireReusable()объекта класса ReusablePool. Объект ReusablePool содержит коллекцию повторно используемых объектов Reusable для построения пула.

Если при вызове метода acquireReusable() в пуле имеются свободные объекты, то acquireReusable() удаляет объект Reusable из пула и возвращает его. Если же пул пустой, то метод acquireReusable() создает новый объект Reusable, если это предусмотрено реализацией. Если же метод acquireReusable() не может создавать новые объекты, то он ждет, пока повторно используемый объект не возвратится в коллекцию.

После использования клиент передает объект Reusable в метод releaseReusable() объекта ReusablePool. Метод releaseReusable() возвращает этот объект в пул свободных для повторного использования объектов.

Во многих приложениях с применением паттерна Object Pool существуют причины для ограничения общего количества существующих объектов Reusable. В таких случаях объект ReusablePool, создающий объекты Reusable, ответственен за создание числа объектов Reusable, не превышающего указанного максимального. Если объект ReusablePool несет ответственность за ограничение количества создаваемого им объектов, то класс ReusablePool должен иметь метод для определения максимального количества создаваемых объектов. На рисунке выше этот метод обозначен как setMaxPoolSize().

Пример паттерна Object Pool

Вам нравится боулинг? Если да, то вы, наверное, знаете, что должны сменить вашу обувь при посещении боулинг-клуба. Полка с обувью - прекрасный пример пула объектов. Когда вы хотите играть, вы берете с нее пару (acquireReusable). А после игры, вы возвращаете обувь обратно на полку (releaseReusable).

Пример паттерна Object Pool

Использование паттерна Object Pool

  • Создайте класс ObjectPool с private массивом объектов внутри.
  • Создайте acquire и release методы в классе ObjectPool.
  • Убедитесь, что ваш ObjectPool является одиночкой.

Особенности паттерна Object Pool

  • Паттерн Factory Method может использоваться для инкапсуляции логики создания объектов. Однако он не управляет ими после их создания. Пул объектов отслеживает объекты, которые он создает.
  • Пулы объектов, как правило, реализуются в виде одиночек.

Источник: http://sourcemaking.com/design_patterns/object_pool/