Шаблон пула объектов (и пул соединений - частный случай этого) очень подробно описан в паттернах Марка Гранда в Java. Том 1' .
Вот базовая диаграмма классов (из изображений Google):
альтернативный текст http://img13.imageshack.us/img13/8448/poolz.png
Основная идея: Client
не должен сам создавать Reusable
объектов. Вместо этого он должен использовать ReusablePool
. Чтобы получить Reusable
объект, он должен вызвать acquireReusable
. Когда ему больше не нужен объект Reusable
, он должен положить его обратно через releaseReusable
.
ReusablePool
содержит список Reusable
объектов. Когда Client
запрашивает Reusable
, пул ищет существующие свободные Reusable
. Если получены все Reusable
объекты, то, если размер списка меньше, чем maxSize
ReusablePool
создает еще один Reusable
объект. Когда размер списка равен maxSize
, пул не создает новые Reusable
. Вместо этого он ждет, пока какой-нибудь другой клиент вернет ему какой-либо объект Reusable
.
Из этого описания можно сделать 2 вывода:
Reusable
объекты не должны иметь состояния (или их состояние должно быть «очищено» в методе releaseReusable
)
ReusablePool
обычно является частью многопоточных приложений, и все средства синхронизации внутри всех его методов должны быть реализованы надлежащим образом (и это не простая задача).