Объектный пул (англ. 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);