ホームページ >Java >&#&チュートリアル >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; } }
Java デザイン パターンの実装オブジェクト プール パターンのサンプル関連記事の詳細については、PHP 中国語 Web サイトに注目してください。