Pri vytváraní aplikácií sa často stretávate s objektmi, ktorých vytvorenie je dosť nákladné. V niektorých scenároch sú náklady na vytvorenie nových objektov dostatočne vysoké na to, aby ovplyvnili výkon aplikácie. Tu prichádza na rad návrhový vzor fondu objektov.
Dizajnový vzor fondu objektov je tvorivý návrhový vzor, ktorý sa používa na recykláciu objektov namiesto ich opätovného vytvorenia zakaždým, keď ich aplikácia potrebuje. Tým, že udržuje opakovane použiteľné inštancie objektov v skupine zdrojov a podľa potreby ich rozdeľuje, pomáha tento vzor minimalizovať réžiu pri inicializácii, inštancii a likvidácii objektov a zvyšovať výkon vašej aplikácie.
Keď aplikácia požaduje objekt a objekt je k dispozícii z fondu, vráti sa z fondu. Ak objekt požadovaného typu nie je k dispozícii z fondu, vytvorí sa a vráti sa nová inštancia objektu. Keď aplikácia už objekt nepotrebuje, objekt sa odošle späť do fondu.
Minimálny a maximálny počet objektov, ktoré môže obsahovať skupina objektov, je konfigurovateľný. Ak aplikácia potrebuje objekt z fondu, ale pridelil sa maximálny počet objektov, môže typická implementácia vlastného fondu objektov prijať jednu alebo viac z nasledujúcich stratégií:
- Vrátiť hodnotu null alebo vyvolať výnimku
- Blokujte hovor, kým nebude k dispozícii objekt
- Zväčšite veľkosť bazénu, aby sa do neho zmestilo viac objektov
Fond objektov je podobný fondu databázových pripojení. Rovnako ako fond pripojení riadi maximálny počet pripojení k databáze, fond objektov riadi počet inštancií tried, ktoré bude aplikácia používať.
Vytvorenie fondu všeobecných objektov v C #
Teraz, keď už poznáme základy, poďme sa pustiť do implementácie. Pri implementácii návrhového vzoru fondu objektov musíme brať do úvahy opätovnú použiteľnosť, jednoduchosť, konfigurovateľnosť a dokonca aj faktory, ako napríklad bezpečnosť vlákien.
V tomto príklade využijeme výhody a ConcurrentBag
triedy na ukladanie predmetov. Všimnite si, že ConcurrentBag
trieda v System.Collections.Concurrent
Obor názvov poskytuje bezobslužnú, neporiadkovú a neusporiadanú kolekciu prvkov. Pamätajte tiež, že vkladanie a vyberanie predmetov do a z a ConcurrentBag
je veľmi rýchle - najmä ak sa rovnaké vlákno pokúša vkladať a vyberať položky zo zbierky súčasne.
Tu je štruktúra nášho zvyku ObjectPool
trieda. Všimnite si použitie ConcurrentBag
napríklad na ukladanie predmetov.
verejná trieda ObjectPool, kde T: new (){
private readonly ConcurrentBag items = new ConcurrentBag ();
private int counter = 0;
súkromný int MAX = 10;
public void Release (položka T)
{
//ROBIŤ
}
verejné T Získať ()
{
//ROBIŤ
}
}
Nasledujúci úryvok kódu ilustruje implementáciu Získajte
metóda. The Získajte
metóda vráti inštanciu z fondu objektov, ak je k dispozícii. Ak žiadny nie je k dispozícii, vytvorí sa a vráti sa nový objekt. V obidvoch týchto scenároch: pult
premenná sa podľa potreby zvyšuje alebo znižuje. Všimnite si, že pretože používame súbežnú zbierku, t.j. ConcurrentBag
v tomto príklade je postarané o súbežnosť.
verejné T Získať (){
Položka T;
if (items.TryTake (out item))
{
pult—;
vrátiť položku;
}
inak
{
T obj = nový T ();
items.Add (obj);
pult ++;
návrat obj;
}
}
The MAX
celočíselná premenná je tu pevne naprogramovaná, ale môžete ju nakonfigurovať. Táto trieda nie je zapečatená alebo statická, takže ju môžete ľubovoľne rozširovať.
The Uvoľnenie
metóda sa používa na uvoľnenie objektov, ktoré už nie sú potrebné, späť do fondu objektov. Kontroluje, či je hodnota pult
premenná je menšia ako hodnota MAX
premenná, a ak je to tak, pridá do nej odovzdaný objekt ako parameter do kolekcie.
public void Release (položka T){
if (počítadlo <MAX)
{
items.Add (item);
pult ++;
}
}
Za predpokladu, že ste vytvorili triedu s názvom Moja trieda
, tu je spôsob, ako ho môžete pridať do fondu objektov pomocou ObjectPool
trieda.
static void Main (reťazec [] args){
ObjectPool objPool = nový ObjectPool ();
MyClass obj = objPool.Get ();
objPool.Release (obj);
Console.Read ();
}
Túto implementáciu vlastného fondu objektov môžete upraviť tak, aby umožňovala čítanie minimálnej a maximálnej veľkosti oblasti z konfiguračného súboru. V rámci inicializácie fondu objektov môžete tiež zabezpečiť, aby fond obsahoval minimálny počet objektov.
Fondy objektov pomáhajú znižovať réžiu zdrojov, keď potrebujete viac inštancií triedy, ktorých vytvorenie alebo správa sú nákladné. Ak vaša aplikácia vyžaduje inštanciu tých istých tried znova a znova, použite tento návrhový vzor na zaistenie optimálneho výkonu.