java設(shè)計(jì)模式之實(shí)現(xiàn)對(duì)象池模式示例分享
ObjectPool抽象父類(lèi)
import java.util.Iterator;
import java.util.Vector;
public abstract class ObjectPool<T> {
private Vector<T> locked, unlocked; // locked是已占用的對(duì)象集合,unlocked是可用對(duì)象集合
public ObjectPool() {
locked = new Vector<T>();
unlocked = new Vector<T>();
}
// 創(chuàng)建對(duì)象
protected abstract T create();
// 驗(yàn)證對(duì)象有效性
public abstract boolean validate(T o);
// 使對(duì)象失效
public abstract void expire(T o);
// 檢出:從對(duì)象池獲取對(duì)象
public synchronized T checkOut() {
T t;
if (unlocked.size() > 0) {
Iterator<T> iter = unlocked.iterator();
while(iter.hasNext()) {
t = iter.next();
if(validate(t)) { // 對(duì)象有效
unlocked.remove(t);
locked.add(t);
return t;
}
else { // 對(duì)象已經(jīng)失效
unlocked.remove(t);
expire(t);
}
}
}
// 對(duì)象池塘沒(méi)有可用對(duì)象,創(chuàng)建新對(duì)象
t = create();
locked.add(t);
return (t);
}
// 檢入:釋放對(duì)象回對(duì)象池
public synchronized void checkIn(T t) {
locked.remove(t);
if(validate(t)) { // 如果對(duì)象仍有效則放回可用對(duì)象集合中
unlocked.add(t);
}
else { // 否則使對(duì)象失效
expire(t);
}
}
}
JDBCConnectionPool子類(lèi)
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();
// 加載對(duì)應(yīng)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)
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");
// 獲取數(shù)據(jù)庫(kù)連接對(duì)象
Connection conn = dbConnPool.checkOut();
// 使用數(shù)據(jù)庫(kù)連接對(duì)象
// ...
// 釋放數(shù)據(jù)庫(kù)連接對(duì)象
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;
}
}
相關(guān)文章
Maven是什么?Maven的概念+作用+倉(cāng)庫(kù)的介紹+常用命令的詳解
Maven是一個(gè)項(xiàng)目管理工具,它包含了一個(gè)對(duì)象模型。一組標(biāo)準(zhǔn)集合,一個(gè)依賴管理系統(tǒng)。和用來(lái)運(yùn)行定義在生命周期階段中插件目標(biāo)和邏輯.,本文給大家介紹Maven的概念+作用+倉(cāng)庫(kù)的介紹+常用命令,感興趣的的朋友跟隨小編一起看看吧2020-09-09
帶你一文深入認(rèn)識(shí)Java?String類(lèi)
這篇文章主要介紹了帶你一文深入認(rèn)識(shí)Java?String類(lèi),String 類(lèi)在Java中是很常用的類(lèi),很重要的類(lèi),在后續(xù)的學(xué)習(xí)中經(jīng)常會(huì)用到,是后續(xù)學(xué)習(xí)的基礎(chǔ), 文章圍繞主題展開(kāi)更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-06-06
Lambda表達(dá)式下訪問(wèn)外部變量問(wèn)題
這篇文章主要介紹了Lambda表達(dá)式下訪問(wèn)外部變量問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Java實(shí)現(xiàn)字符串解析為日期時(shí)間的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)字符串解析為日期時(shí)間的方法,結(jié)合具體實(shí)例形式分析了java日期時(shí)間字符串的解析操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-04-04

