用C 建立通用物件池 2

2021-04-03 02:27:50 字數 4123 閱讀 8750

建立乙個介面,用於限定物件池中所儲存的物件的基本行為:

public

inte***ce idynamicobject

我們在物件池中存放的物件,必須繼承上面的介面,並實現介面定義的每乙個方法。

create方法中,使用者可以用來建立實際的物件,如建立資料庫連線,並開啟這個連線;getinnerobject方法,使使用者可以返回這個實際的物件,如乙個sqlconnection物件;isvalidate方法是用來判斷使用者自定義物件的有效性的,是物件池決定是否重新建立物件的標誌;release方法中,使用者可以進行資源釋放工作。

有了上面的介面定義,為我們可以在列表中儲存使用者自定義物件打下了基礎。下面就是要實現這個objectpool了。

使用者自定義物件在我們的objectpool中,可以用列表儲存,如arraylist或者hashtable,為了表示每個使用者物件的狀態,我們還需要將使用者自定義物件包裝一下,然後在放到列表中儲存。下面定義了乙個objectpool類的子類,用於包裝使用者自定義物件:

private

class poolitem

private

void create()

public

void recreate()

public

void release()

public object innerobject

}

public

int innerobjecthashcode

}

public

bool isvalidate

}

public

bool using

set

}

}// class poolitem

這個類,乙個關鍵的屬性是using,該屬性表示物件是否正在被被使用者使用。注意,poolitem建立時,接受乙個object型別的param引數,這個引數最後被傳遞給使用者自定義物件的create方法。使用者可以利用這一點,在建立objectpool時指定一些引數,供其自定義物件在建立時使用。比如建立socketpool時,將伺服器ip,埠通過param傳遞給自定義物件的create方法,使用者就可以在create方法中連線指定的伺服器了。

以下是objectpool的具體實現**:

public

sealed

class objectpool

_ncapacity = capacity;

_listobjects = new hashtable(capacity);

_listfreeindex = new arraylist(capacity);

_listusingindex = new arraylist(capacity);

_typeobject = type;

_objcreateparam = create_param;

for(int i=0;i

_ncurrentsize = _listobjects.count;

}

public

void release()

_listobjects.clear();

_listfreeindex.clear();

_listusingindex.clear();

}

}

public int32 currentsize

}

public int32 activecount

}

public object getone()

poolitem pnewitem = new poolitem(_typeobject,_objcreateparam);

_listobjects.add(pnewitem.innerobjecthashcode,pnewitem);

_listfreeindex.add(pnewitem.innerobjecthashcode);

_ncurrentsize++;

}

int32 nfreeindex = (int32)_listfreeindex[0];

poolitem pitem = (poolitem)_listobjects[nfreeindex];

_listfreeindex.removeat(0);

_listusingindex.add(nfreeindex);

if(!pitem.isvalidate)

pitem.using = true;

return pitem.innerobject;

}

}

public

void freeobject(object obj)

}

}

public int32 decreasesize(int32 size)

if(ndecrease > _listfreeindex.count)

for(int i=0;i

_listfreeindex.clear();

_listusingindex.clear();

foreach(dictionaryentry de in _listobjects)

else

} }

_ncurrentsize -= ndecrease;

return ndecrease;

}

}

下篇再給出乙個用這個objectpool實現的資料庫連線池的例子。

用C 建立通用物件池 1

在系統設計中,經常會使用 池 的概念。比如資料庫連線池,socket 連線池,執行緒池,元件佇列。池 可以節省物件重複建立和初始化所耗費的時間,可以簡化物件獲取和使用的過程。對於那些被系統頻繁請求和使用的物件,如果使用這種機制,可以使系統效能得到很大提高。特別象資料庫連線這種物件,客戶端與資料庫伺服...

Unity 通用 物件池管理

一般情況下我們使用物件池是物體的建立和管理。但在很多情況下需要批量建立的物體需要做一些邏輯處理,這樣我們需要記錄物件池對應的資料狀態。所以我們就直接把物件作為管理物件,這樣我們可以在物件裡面做一些邏輯處理還能便於物體管理。作為物件管理類,那麼我們必須要乙個同乙個父類作為管理的類別。在父類裡面包含一些...

java 通用物件池的實現

本文以apache common pools為例 pooledobject 可被池化的物件 預設實現defaultpooledobject,裡面封裝了乙個真正的使用者需要池化的物件object。其中defaultpooledobject裡面有兩個方法 exception borrowedby 用於記...