設計模式--對象池模式

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章