欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式--对象池模式

程序员文章站 2022-05-05 13:13:34
...

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