import org.apache.commons.pool.PoolableObjectFactory;
public class ObjectPoolFactoryDome implements PoolableObjectFactory  {
public void activateObject(Object arg0) throws Exception {
System.err.println("激活对象:" + arg0);
} public void destroyObject(Object arg0) throws Exception {
System.err.println("销毁: " + arg0);
}
    
public Object makeObject() throws Exception {
List li=new ArrayList();
li.add(0, "1");
    System.err.println("添加对象: " + li);
    return li;
} public void passivateObject(Object arg0) throws Exception {
System.err.println("挂起对象: " + arg0);
} public boolean validateObject(Object arg0) {
boolean result = (Math.random() > 0.5);
    System.err.println("校验一个具体的对象是否仍然有效: "+ arg0 + " : " + result);
    return result; }
}
 public static void main(String[] args) {
        List obj = null;
        PoolableObjectFactory factory = new ObjectPoolFactoryDome();//通过PoolableObjectFactory接口的实例ObjectPoolFactoryDome获得一个池工厂;
        ObjectPoolFactory poolFactory = new StackObjectPoolFactory(factory);//用池工厂作为参数通过StackObjectPoolFactory实例得到一个池对象
        ObjectPool pool = poolFactory.createPool();//创建池对象
        try {
            obj = (List)pool.borrowObject();//借出对象
            System.out.println("从对象池中取出对象:"+obj.get(0)); 
            System.out.println("返回已经从此对象池中借出的对象的总数:"+pool.getNumActive()); 
            System.out.println("返回当前在此对象池中休眠的对象的数目:"+pool.getNumIdle()); 
            pool.returnObject(obj);//归还对象的同时会调用挂起方法,将对对象处于挂起状态;
            obj = null;//明确地设为null,作为对象已归还的标志
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            try{
                if (obj != null) {//避免将一个对象归还两次
                    pool.returnObject(obj);//归还对象
                }else{
                  pool.close();//在归还了的情况下关闭当前对象池(销毁)
                  System.out.println("对象已销毁");
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }