Образец пула объектов (и пул соединений - частный случай) подробно описан в «Шаблонах» Марка Гранда в Java. Том 1' .
Вот основная диаграмма классов (от Google изображений):
alt text 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
, как правило, часть многопоточных приложений и все материалы синхронизации во всех его методах должны быть реализованы надлежащим образом (и это непростая задача).