@startuml class PoolingDataSource{ - final ObjectPool pool } class GenericObjectPool{ - final PooledObjectFactory factory - final Map, PooledObject> allObjects - final LinkedBlockingDeque> idleObjects - Evictor evictor + T borrowObject() + void returnObject(final T obj) } interface ConnectionFactory class DriverConnectionFactory{ + Connection createConnection() } interface PooledObjectFactory class PoolableConnectionFactory{ - final ConnectionFactory connectionFactory - volatile ObjectPool pool + PooledObject makeObject() + void destroyObject(PooledObject p) + boolean validateObject(PooledObject p) + void activateObject(PooledObject p) } GenericObjectPool -down-* PoolingDataSource DriverConnectionFactory .up.|> ConnectionFactory PoolableConnectionFactory .up.|> PooledObjectFactory DriverConnectionFactory -down-* PoolableConnectionFactory PoolableConnectionFactory -left-* GenericObjectPool PoolableConnectionFactory *-right- GenericObjectPool @enduml