对象池模式详解
发表于2019-03-19
对象池模式是单例模式的一个变种,它提供了获取一系列相同对象实例的入口。当你需要对象来代表一组可替代资源的时候就变的很有用,每个对象每次可以被一个组件使用。下面我们就来学习下。
当创建多个对象会的代价会很大的时候,可以考虑使用对象池技术,目前已有的技术比如:线程池技术、数据库连接池技术。
2、UML图(astah/jude)下载地址:
3、模拟一个数据库连接池进行实现:
实现的接口:
package com.xinye.test.pool; /** * 用户需要的实际的东西都实现这个接口 * @author xinye * */ public interface IConnection { Object get(); void set(Object obj); }
实现类:
package com.xinye.test.pool; /** * 用户真正需要的东西,比如数据库连接 * @author xinye * */ public class Connection implements IConnection{ @Override public Object get() { // TODO Auto-generated method stub return null; } @Override public void set(Object obj) { // TODO Auto-generated method stub } }
实现类的包装对象(添加状态):
package com.xinye.test.pool; /** * 池子中放的东西(具有状态以及用户实际需要的东西,实际上就是个包装类) * @author xinye * */ public class PoolItem { public boolean isUse; public IConnection conn; public PoolItem(IConnection conn){ this.conn = conn; } }
池子管理对象:
package com.xinye.test.pool; import java.util.ArrayList; /** * 池子管理类 * @author wangheng * */ public class PoolManager { private ArrayList<PoolItem> items = new ArrayList<PoolItem>(); /** * 往池子里面放东西 * @param conn */ public synchronized void add(IConnection conn){ items.add(new PoolItem(conn)); } /** * 得到池子中的对象 * @return * @throws PoolEmptyException */ public synchronized IConnection get() throws PoolEmptyException{ int len = items.size(); for(int i = 0;i < len;i++){ PoolItem item = items.get(i); if(item.isUse == false){ item.isUse = true; return item.conn; } } throw new PoolEmptyException(); } /** * 释放对象 * @param conn * @throws PoolEmptyException */ public synchronized void release(IConnection conn) throws PoolEmptyException{ int len = items.size(); for(int i = 0;i < len;i++){ PoolItem item = items.get(i); if(conn == item.conn){ item.isUse = false; return; } } throw new PoolEmptyException(); } /** * 池子是空的异常 * @author wangheng * */ public static class PoolEmptyException extends Exception{ /** * */ private static final long serialVersionUID = 5617927009406316965L; } }
连接池对象:
package com.xinye.test.pool; import com.xinye.test.pool.PoolManager.PoolEmptyException; /** * 用户真正需要关心的池子 * @author xinye * */ public class ConnectionPool { private static PoolManager manager = new PoolManager(); /** * 批量添加连接对象 * @param count */ public static void addConnections(int count){ for(int i = 0;i < count;i++){ manager.add(new Connection()); } } /** * 得到连接对象 * @return * @throws PoolEmptyException */ public static IConnection getConnection() throws PoolEmptyException{ return manager.get(); } /** * 释放链接 * @param conn * @throws PoolEmptyException */ public static void release(IConnection conn) throws PoolEmptyException{ manager.release(conn); } }
以上就是对象池模式的全部介绍,相信大家对于对象池模式有了一个基本的认知了吧,如果想要使用好它,还需要大家多花时间去理解。