设计模式--对象池模式

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

 

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