对象池(参考《Thinking in Patterns》)

        在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);
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值