Паттерн проектирования Object pool (Объектный пул) на PHP

Объектный пул (англ. object pool) — порождающий паттерн (шаблон) проектирования, набор инициализированных и готовых киспользованию объектов. Когда системе требуется объект, он не создаётся, а берётся из пула. Когда объектбольше не нужен, он не уничтожается, а возвращается в пул.


Применение

Объектный пул применяется для повышения производительности, когда создание объекта в начале работы иуничтожение его в конце приводит к большим затратам. Особенно заметно повышение производительности, когдаобъекты часто создаются-уничтожаются, но одновременно существует лишь небольшое их число.


Переполнение

Если в пуле нет ни одного свободного объекта, возможна одна из трёх стратегий:

  • Расширение пула.
  • Отказ в создании объекта, аварийный останов.
  • В случае многозадачной системы, можно подождать, пока один из объектов не освободится.

Примеры

  • Информация об открытых файлах в DOS.
  • Информация о видимых объектах во многих компьютерных играх (хорошим примером является движок Doom). Этаинформация актуальна только в течение одного кадра; после того, как кадр выведен, список опустошается.
  • Компьютерная игра для хранения всех объектов на карте, вместо того, чтобы использовать обычные механизмыраспределения памяти, может завести массив такого размера, которого заведомо хватит на все объекты, исвободные ячейки держать в виде связного списка. Такая конструкция повышает скорость, уменьшаетфрагментацию памяти и снижает нагрузку на сборщик мусора (если он есть).

Ловушки

  • После того, как объект возвращён, он должен вернуться в состояние, пригодное для дальнейшегоиспользования. Если объекты после возвращения в пул оказываются в неправильном или неопределённомсостоянии, такая конструкция называется объектной клоакой (англ. object cesspool).
  • Повторное использование объектов также может привести к утечке информации. Если в объекте есть секретныеданные (например, номер кредитной карты), после освобождения объекта эту информацию надо затереть.

 1: <?php
 2:
 3:
class ORMTable
 4:
{
 5:     public static function 
find($id)
 6:     {
 7:         return new 
self($id); //one record from DB
 8:     
}
 9: }
10:
11: class 
RecordList
12:
{
13:     protected static 
$instance = array();
14:
15:     public static function 
getRecord($id)
16:     {
17:         if (
is_null(self::$instance[$id])) {
18:             
self::$instance[$id] = ORMTable::find($id);
19:         }
20:         
returnself::$instance[$id];
21:     }
22: }
23:
24:
$city['Kiev'] = RecordList::getRecord(10);
25:
$city['Moscow'] = RecordList::getRecord(20);

Теги: Объектный пул, Object pool, Порождающие шаблоны


Похожие статьи

Паттерн проектирования Lazy initialization (Отложенная инициализация) на PHP

Паттерн проектирования Factory Method (Фабричный метод) на PHP

Паттерн проектирования Builder (Строитель) на PHP

Паттерн проектирования Multiton (Пул одиночек) на PHP

Паттерн проектирования Abstract Factory (Абстрактная фабрика) на PHP

Паттерн проектирования Singleton (Одиночка) на PHP

Паттерн проектирования Prototype (Прототип) на PHP

Паттерн проектирования Resource Acquisition Is Initialization - RAII (Получение ресурса есть инициализация) на PHP