Programovanie

Ako používať návrhový vzor fondu objektov v C #

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í:

  1. Vrátiť hodnotu null alebo vyvolať výnimku
  2. Blokujte hovor, kým nebude k dispozícii objekt
  3. 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.

$config[zx-auto] not found$config[zx-overlay] not found