首页 > 代码库 > 对象池模式
对象池模式
1、对象池技术并没有限制说只能创建一个对象,而且这种技术同样适用于创建固定数量的对象,然而,这种情况下,你就得面对如何共享对象池里的对象这种问题。
当创建多个对象会的代价会很大的时候,可以考虑使用对象池技术,目前已有的技术比如:线程池技术、数据库连接池技术
2、UML图(astah/jude)下载地址:
3、模拟一个数据库连接池进行实现:
实现的接口:
1 package com.xinye.test.pool; 2 /** 3 * 用户需要的实际的东西都实现这个接口 4 * @author xinye 5 * 6 */ 7 public interface IConnection { 8 Object get(); 9 void set(Object obj);10 }
实现类:
1 package com.xinye.test.pool; 2 /** 3 * 用户真正需要的东西,比如数据库连接 4 * @author xinye 5 * 6 */ 7 public class Connection implements IConnection{ 8 9 @Override10 public Object get() {11 // TODO Auto-generated method stub12 return null;13 }14 15 @Override16 public void set(Object obj) {17 // TODO Auto-generated method stub18 19 }20 21 }
实现类的包装对象(添加状态):
1 package com.xinye.test.pool; 2 /** 3 * 池子中放的东西(具有状态以及用户实际需要的东西,实际上就是个包装类) 4 * @author xinye 5 * 6 */ 7 public class PoolItem { 8 public boolean isUse; 9 public IConnection conn;10 public PoolItem(IConnection conn){11 this.conn = conn;12 }13 }
池子管理对象:
1 package com.xinye.test.pool; 2 3 import java.util.ArrayList; 4 /** 5 * 池子管理类 6 * @author wangheng 7 * 8 */ 9 public class PoolManager {10 11 private ArrayList<PoolItem> items = new ArrayList<PoolItem>();12 /**13 * 往池子里面放东西14 * @param conn15 */16 public synchronized void add(IConnection conn){17 items.add(new PoolItem(conn));18 }19 /**20 * 得到池子中的对象21 * @return22 * @throws PoolEmptyException23 */24 public synchronized IConnection get() throws PoolEmptyException{25 int len = items.size();26 for(int i = 0;i < len;i++){27 PoolItem item = items.get(i);28 if(item.isUse == false){29 item.isUse = true;30 return item.conn;31 }32 }33 throw new PoolEmptyException();34 }35 /**36 * 释放对象37 * @param conn38 * @throws PoolEmptyException39 */40 public synchronized void release(IConnection conn) throws PoolEmptyException{41 int len = items.size();42 for(int i = 0;i < len;i++){43 PoolItem item = items.get(i);44 if(conn == item.conn){45 item.isUse = false;46 return;47 }48 }49 throw new PoolEmptyException();50 }51 /**52 * 池子是空的异常53 * @author wangheng54 *55 */56 public static class PoolEmptyException extends Exception{57 /**58 * 59 */60 private static final long serialVersionUID = 5617927009406316965L;61 62 }63 64 }
连接池对象:
1 package com.xinye.test.pool; 2 3 import com.xinye.test.pool.PoolManager.PoolEmptyException; 4 5 /** 6 * 用户真正需要关心的池子 7 * @author xinye 8 * 9 */10 public class ConnectionPool {11 private static PoolManager manager = new PoolManager();12 /**13 * 批量添加连接对象14 * @param count15 */16 public static void addConnections(int count){17 for(int i = 0;i < count;i++){18 manager.add(new Connection());19 }20 }21 /**22 * 得到连接对象23 * @return24 * @throws PoolEmptyException25 */26 public static IConnection getConnection() throws PoolEmptyException{27 return manager.get();28 }29 /**30 * 释放链接31 * @param conn32 * @throws PoolEmptyException33 */34 public static void release(IConnection conn) throws PoolEmptyException{35 manager.release(conn);36 }37 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。