commons-pool2源碼走讀(二) 對象工廠PooledObjectFactory <T> 接口
PooledObjectFactory <T> 顧名思義是一個池對象的工廠類,通過該類獲得一個池對象的包裝類PooledObject<T> 同時該接口還定義了對池對象的一些操作,比如校驗、銷燬、激活、卸載。下面來看看其接口的具體定義和實現。
1. 接口定義
public interface PooledObjectFactory<T> {
//創建
PooledObject<T> makeObject() throws Exception;
//銷燬
void destroyObject(PooledObject<T> p) throws Exception;
//驗證
boolean validateObject(PooledObject<T> p);
//激活
void activateObject(PooledObject<T> p) throws Exception;
//卸載(鈍化)
void passivateObject(PooledObject<T> p) throws Exception;
}
該工廠接口定義的方法,完整覆蓋了一個池對象,在池中的整個生命週期需要經歷的步驟。再回顧下這些操作在池對象的生命週期的什麼時候發生:
2. 抽象空實現BasePooledObjectFactory<T>
該抽象類定義如下:
public abstract class BasePooledObjectFactory<T> extends BaseObject implements
PooledObjectFactory<T> {
public abstract T create() throws Exception;
public abstract PooledObject<T> wrap(T obj);
@Override
public PooledObject<T> makeObject() throws Exception {
return wrap(create());
}
@Override
public void destroyObject(final PooledObject<T> p)
throws Exception {
// The default implementation is a no-op.
}
@Override
public boolean validateObject(final PooledObject<T> p) {
return true;
}
@Override
public void activateObject(final PooledObject<T> p) throws Exception {
// The default implementation is a no-op.
}
@Override
public void passivateObject(final PooledObject<T> p)
throws Exception {
// The default implementation is a no-op.
}
}
BasePooledObjectFactory<T> 只是PooledObjectFactory<T> 的一個空實現,同時抽象出 create()和 wrap(T obj);方法,是工廠的定義更加貼切,畢竟創建的對象是T對象而不是包裝類。
3.自定義實現
該接口需自行實現,可以實現PooledObjectFactory <T> 或者繼承BasePooledObjectFactory<T> 顯然二者沒有明顯的區別。