在Bruce Eckel的《Thinking in Patterns》书中给出了一个Object Pool的例子,看上去很舒服,所以照着写了一下,在这里存档。
/*
* EmptyPoolException.java
*
* Date: 2005.9.19
*/
package objectpool;
/**
* 对象池为空异常
* @author Sunny
* @version 1.0
*/
public final class EmptyPoolException extends Exception {
/**
* 缺省构造方法
*
*/
public EmptyPoolException() {
super("Object pool is empty!");
}
}
/*
* PoolManager.java
*
* Date: 2005.9.16
*/
package objectpool;
import java.util.ArrayList;
/**
* 对象池管理器
* @author Sunny
* @version 1.0
*/
public class PoolManager {
//池中发放置的对象
private static class PoolItem {
boolean isUse = false;
Object item;
PoolItem(Object item) {
this.item = item;
}
}
//池中对象列表
private ArrayList items = new ArrayList();
/**
* 往对象池中添加一个PoolItem
* @param item PoolItem的构造方法参数
*/
public void add(Object item) {
items.add(new PoolItem(item));
}
/**
* 试图从池中得到一个对象,如果对象都在使用的话抛出
* EmptyPoolException
*
* @return 池中没有被使用的对象
* @throws EmptyPoolException
*/
public Object get() throws EmptyPoolException {
for(int i = 0; i < items.size(); i++) {
PoolItem temp = (PoolItem)items.get(i);
if(!temp.isUse) {
temp.isUse = true;
return temp.item;
}
}
//所有的对象都在使用
throw new EmptyPoolException();
}
/**
* 把不用的对象重新放回池中
* @param item 要放回的对象
*/
public void release(Object item) {
for(int i = 0; i < items.size(); i++) {
PoolItem temp = (PoolItem)items.get(i);
if(item == temp.item) {
temp.isUse =false;
break;
}
}
}
}
/*
* Connection.java
*
* Date: 2005.9.16
*/
package objectpool;
/**
* 简单的Connection
* @author Sunny
* @version 1.0
*/
public class Connection {
/**
*
* @return
*/
public Object get() { return null; }
/**
*
* @param s
*/
public void set(Object s) {}
}
/*
* ConnectionPool.java
*
* Date: 2005.9.19
*/
package objectpool;
/**
* 链接池,使用Singleton模式
* @author Sunny
* @version 1.0
*/
public final class ConnectionPool {
private static PoolManager pool = new PoolManager();
/**
* 往链接池中放置链接
* @param size 链接池的大小
*/
public static void addConnection(int size) {
for(int i = 0; i < size; i++)
pool.add(new Connection());
}
/**
* 从链接池中得到一个链接,若池为空则抛出EmptyPoolException
* @return
* @throws EmptyPoolException
*/
public static Connection getConnection() throws EmptyPoolException{
return (Connection)pool.get();
}
/**
* 释放一个链接
* @param connection 要释放的链接对象
*/
public static void releaseConnection(Connection connection) {
pool.release(connection);
}
}