1.什麼是對象池模式
對象池技術並沒有限制說只能創建一個對象,而且這種技術同樣適用於創建固定數量的對象,然而,這種情況下,你就得面對如何共享對象池裏的對象這種問題。
當創建多個對象會的代價會很大的時候,可以考慮使用對象池技術,目前已有的技術比如:線程池技術、數據庫連接池技術
2.UML圖
3.模擬一個數據庫連接池進行實現:
實現接口、實現類、包裝類
實現的接口:
package com.xinye.test.pool;
/**
* 用戶需要的實際的東西都實現這個接口
*
*/
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);
}
}