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 @Override 10 public Object get() { 11 // TODO Auto-generated method stub 12 return null; 13 } 14 15 @Override 16 public void set(Object obj) { 17 // TODO Auto-generated method stub 18 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 conn 15 */ 16 public synchronized void add(IConnection conn){ 17 items.add(new PoolItem(conn)); 18 } 19 /** 20 * 得到池子中的对象 21 * @return 22 * @throws PoolEmptyException 23 */ 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 conn 38 * @throws PoolEmptyException 39 */ 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 wangheng 54 * 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 count 15 */ 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 * @return 24 * @throws PoolEmptyException 25 */ 26 public static IConnection getConnection() throws PoolEmptyException{ 27 return manager.get(); 28 } 29 /** 30 * 释放链接 31 * @param conn 32 * @throws PoolEmptyException 33 */ 34 public static void release(IConnection conn) throws PoolEmptyException{ 35 manager.release(conn); 36 } 37 }