Generalmente se usa cuando tienes un algoritmo que crea y destruye objetos continuamente. La idea general es tener un administrador de estos objetos y no llamar directamente al constructor ni al destructor, sino a funciones del administrador de ese pool de objetos para reservar un objeto o para liberarlo.
El administrador del pool objetos se encarga de crear una cantidad de estos inicialmente y a medida que le van pidiendo mas objetos vuelve a crear otro paquete de estos de forma que no tenga que crear el paquete muy seguido ni cree tantos objetos que la mayoria nunca sean usados. Al liberar un paquete lo que hace es marcarlo como disponible para entregarlo al proceso que necesite un objeto nuevo. Si existen varios objetos liberados en el pool de objetos, entonces recien procede a liberar la memoria que ocupan de forma de evitar tener que volver a reservar esa memoria nuevamente.
Esto es especialmente efectivo si los objetos no tienen mucho peso en memoria, por ejemplo menos de 4kb, para evitar molestar continuamente al sistema operativo que administra la memoria y para evitar fragmentar la memoria RAM de forma que los bloques reservados/liberados sean de megas en lugar de kbytes.
Tambien sirve de mucho para evitar bugs por administracion de memoria ya que toda la adiministracion de esta esta centralizada en el administrador de objetos del pool y si queremos podemos potenciarlo de tal forma que podamos pedir informacion de que funcion/proceso pidio reservar un objeto, cuando lo hizo y sacar estadisticas de reserva/liberacion de los objetos del pool.