对象池模式详解

发表于2019-03-19
评论0 1k浏览
对象池模式是单例模式的一个变种,它提供了获取一系列相同对象实例的入口。当你需要对象来代表一组可替代资源的时候就变的很有用,每个对象每次可以被一个组件使用。下面我们就来学习下。

1、对象池技术并没有限制说只能创建一个对象,而且这种技术同样适用于创建固定数量的对象,然而,这种情况下,你就得面对如何共享对象池里的对象这种问题。

当创建多个对象会的代价会很大的时候,可以考虑使用对象池技术,目前已有的技术比如:线程池技术、数据库连接池技术。

2、UML图(astah/jude)下载地址:

3、模拟一个数据库连接池进行实现:

实现的接口:
package com.xinye.test.pool;
/**
 * 用户需要的实际的东西都实现这个接口
 * @author xinye
 *
 */
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);
    }
}

以上就是对象池模式的全部介绍,相信大家对于对象池模式有了一个基本的认知了吧,如果想要使用好它,还需要大家多花时间去理解。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引