设计模式--对象池模式
程序员文章站
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);
}
}
下一篇: python匿名函数定义及实例解析