Объектный пул — это порождающий паттерн проектирования, который управляет набором заранее инициализированных объектов, готовых к использованию. Когда системе нужен объект, она не создает его, а берет из пула, а после использования возвращает обратно.
Стоит использовать когда:
- Когда создание объектов дорого стоит (по времени или ресурсам)
- Когда объекты часто создаются и уничтожаются
- Когда количество одновременно используемых объектов ограничено
- Для управления подключениями к БД, потоками, сетевыми соединениями
Используется в соединениях с БД, в HTTP-клиентах, потоках и процессах и в игровых движках
Плюсы:
- Сокращает накладные расходы на создание/уничтожение объектов.
- Контролирует количество активных объектов.
- Улучшает производительность при работе с "дорогими" объектами.
Минусы:
- Требует корректного возврата объектов в пул.
- Усложняет код.
- Может привести к утечкам памяти, если объекты не возвращаются.
В отличие от других Фабричного метода, Одиночки и Прототипа, Объектный пул переиспользует множество объектов, управляет их жизненным циклом
Пример с контекстным менеджером `from contextlib import contextmanager
class ConnectionPool: def init(self, max_size): self.max_size = max_size self.pool = [] self._in_use = set()
def _create_connection(self): return {"id": id({}), "status": "active"}
@contextmanager def get_connection(self): if len(self.pool) > 0: conn = self.pool.pop() elif len(self.in_use) < self.max_size: conn = self._create_connection() else: raise Exception("Достигнут лимит соединений")
self.in_use.add(conn["id"]) try: yield conn finally: self.in_use.remove(conn["id"]) self._pool.append(conn)
#Использованиеif name == "main": pool = ConnectionPool(2)
try: with pool.get_connection() as conn1: print(f"Используем соединение {conn1['id']}")
with pool.get_connection() as conn2: print(f"Используем соединение {conn2['id']}")
#Это вызовет исключение, так как пул переполненtry: with pool.get_connection() as conn3: print(f"Используем соединение {conn3['id']}") except Exception as e: print(f"Ошибка: {e}") except Exception as e: print(f"Ошибка: {e}") #weekofpatterns`