java设计模式之实现对象池模式示例分享

      2020-04-08 13:27      JAVA编程
对象池模式经常用在频繁创建、销毁对象(并且对象创建、销毁开销很大)的场景,比如数据库连接池、线程池、任务队列池等。本代码简单,没有限制对象池大小

ObjectPool抽象父类

复制代码 代码如下:
import java.util.Iterator;
import java.util.Vector;

public abstract class ObjectPool<T> {

private Vector<T> locked, unlocked; // locked是已占用的对象集合,unlocked是可用对象集合

public ObjectPool() {
locked = new Vector<T>();
unlocked = new Vector<T>();
}

// 创建对象
protected abstract T create();

// 验证对象有效性
public abstract boolean validate(T o);

// 使对象失效
public abstract void expire(T o);

// 检出:从对象池获取对象
public synchronized T checkOut() {
T t;
if (unlocked.size() > 0) {
Iterator<T> iter = unlocked.iterator();
while(iter.hasNext()) {
t = iter.next();
if(validate(t)) { // 对象有效
unlocked.remove(t);
locked.add(t);

return t;
}
else { // 对象已经失效
unlocked.remove(t);
expire(t);
}
}
}

// 对象池塘没有可用对象,创建新对象
t = create();
locked.add(t);

return (t);
}

// 检入:释放对象回对象池
public synchronized void checkIn(T t) {
locked.remove(t);
if(validate(t)) { // 如果对象仍有效则放回可用对象集合中
unlocked.add(t);
}
else { // 否则使对象失效
expire(t);
}
}

}

JDBCConnectionPool子类

复制代码 代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCConnectionPool extends ObjectPool<Connection> {

private String url, usr, pwd;

public JDBCConnectionPool(String driver, String url, String usr, String pwd) {
super();

// 加载对应的数据库驱动
try {
Class.forName(driver).newInstance();
}
catch(Exception e) {
e.printStackTrace();
}

this.url = url;
this.usr = usr;
this.pwd = pwd;
}

@Override
protected Connection create() {
try {
return DriverManager.getConnection(url, usr, pwd);
}
catch(SQLException e) {
e.printStackTrace();
}

return null;
}

@Override
public boolean validate(Connection o) {
try {
return o.isClosed();
}
catch(SQLException e) {
e.printStackTrace();
}

return false;
}

@Override
public void expire(Connection o) {
try {
o.close();
}
catch(SQLException e) {
e.printStackTrace();
}
finally {
o = null;
}
}

public static void main(String[] args) {
JDBCConnectionPool dbConnPool = new JDBCConnectionPool("com.mysql.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test", "root", "123");

// 获取数据库连接对象
Connection conn = dbConnPool.checkOut();

// 使用数据库连接对象
// ...

// 释放数据库连接对象
dbConnPool.checkIn(conn);

}

}

复制代码 代码如下:
class Pool {
private static final MAX_AVAILABLE = 100;
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

public Object getItem() throws InterruptedException {
available.acquire();
return getNextAvailableItem();
}

public void putItem(Object x) {
if (markAsUnused(x))
available.release();
}

// Not a particularly efficient data structure; just for demo

protected Object[] items = ... whatever kinds of items being managed
protected boolean[] used = new boolean[MAX_AVAILABLE];

protected synchronized Object getNextAvailableItem() {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (!used[i]) {
used[i] = true;
return items[i];
}
}
return null; // not reached
}

protected synchronized boolean markAsUnused(Object item) {
for (int i = 0; i < MAX_AVAILABLE; ++i) {
if (item == items[i]) {
if (used[i]) {
used[i] = false;
return true;
} else
return false;
}
}
return false;
}

}