Programiranje

Kako uporabiti vzorec oblikovanja bazena predmetov v C #

Pri gradnji aplikacij pogosto naletite na predmete, ki jih je ustvariti precej drago. V nekaterih scenarijih so stroški ustvarjanja novih predmetov dovolj visoki, da vplivajo na zmogljivost aplikacije. Tukaj reši vzorec oblikovanja bazena predmetov.

Vzorec oblikovanja področja predmetov je kreativni vzorec oblikovanja, ki se uporablja za recikliranje predmetov, namesto da bi jih ustvaril vsakič, ko jih aplikacija potrebuje. Z ohranjanjem primerkov predmetov, ki jih je mogoče večkrat uporabiti, v naboru virov in jih po potrebi razdeli, ta vzorec pomaga zmanjšati režijske stroške inicializacije, instanciranja in odstranjevanja predmetov ter povečati učinkovitost vaše aplikacije.

Ko aplikacija zahteva objekt in je objekt na voljo iz področja, se vrne iz bazena. Če objekt zahtevanega tipa ni na voljo iz področja, se ustvari in vrne nov primerek predmeta. Ko aplikacija predmeta ne potrebuje več, se objekt pošlje nazaj v področje.

Najmanjše in največje število predmetov, ki jih lahko hrani objektno področje, je mogoče konfigurirati. Če aplikacija potrebuje objekt iz področja, vendar je bilo dodeljeno največje število predmetov, lahko tipična izvedba področja predmetov po meri sprejme eno ali več naslednjih strategij:

  1. Vrni nič ali vrzi izjemo
  2. Blokirajte klic, dokler ni na voljo predmet
  3. Povečajte velikost bazena, da lahko sprejmete več predmetov

Področje predmetov je podobno področju povezav z bazo podatkov. Tako kot področje povezav nadzoruje največje število povezav do baze podatkov, tudi področje predmetov nadzoruje število primerkov razreda, ki jih bo aplikacija uporabila.

Ustvarjanje generičnega področja predmetov v jeziku C #

Zdaj, ko poznamo osnove, pojdimo k izvedbi. Pri izvedbi vzorca načrtovanja področja predmetov moramo upoštevati ponovno uporabnost, preprostost, konfigurabilnost in celo dejavnike, kot je varnost niti.

V tem primeru bomo izkoristili a ConcurrentBag razred za shranjevanje predmetov. Upoštevajte, da ConcurrentBag razred v System.Collections.Concurrent namespace ponuja zbirko elementov brez ključavnic, varno pred nitmi in neurejeno. Upoštevajte tudi, da vstavljanje in odstranjevanje predmetov v a ConcurrentBag je zelo hiter - še posebej, če poskuša ista nit hkrati vstavljati in odstranjevati predmete iz zbirke.

Tu je struktura našega običaja ObjectPool razred. Upoštevajte uporabo ConcurrentBag primer za shranjevanje predmetov.

javni razred ObjectPool, kjer je T: novo ()

    {

zasebni predmeti ConcurrentBag samo za branje = new ConcurrentBag ();

zasebni števec int = 0;

zasebno int MAX = 10;

javna praznina (T postavka)

        {

//NAREDITI

        }

javni T Get ()

        {

//NAREDITI

        }

    }

Naslednji delček kode prikazuje izvajanje Pojdi metoda. The Pojdi metoda vrne primerek iz področja predmetov, če je na voljo. Če nobena ni na voljo, se ustvari in vrne nov objekt. V obeh scenarijih je števec spremenljivka se po potrebi poveča ali zmanjša. Upoštevajte, da ker uporabljamo sočasno zbirko, tj. ConcurrentBag v tem primeru je poskrbljeno za sočasnost.

javni T Get ()

        {

T element;

if (items.TryTake (out item))

            {

števec—;

vrni artikel;

            }

drugače

            {

T obj = nov T ();

items.Add (obj);

števec ++;

vrni obj;

            }

        }

The NAJVEČ Celoštevilčna spremenljivka je tukaj težko kodirana, vendar jo lahko nastavite. Ta razred ni zatesnjen ali statičen, zato ga lahko poljubno razširite.

The Sprostite metoda se uporablja za sprostitev predmetov, ki niso več potrebni, nazaj v področje objektov. Preveri, ali je vrednost števec spremenljivka je manjša od vrednosti NAJVEČ spremenljivka, in če je tako, doda predmet, ki mu je poslan kot parameter, v zbirko.

javna praznina (T postavka)

        {

če (števec <MAX)

            {

items.Add (item);

števec ++;

            }           

        }

Ob predpostavki, da ste ustvarili razred z imenom Moj razred, tukaj je opisano, kako ga lahko dodate v področje predmetov s pomočjo ObjectPool razred.

statična praznina Main (string [] args)

        {

ObjectPool objPool = nov ObjectPool ();

MyClass obj = objPool.Get ();

objPool.Release (obj);

Console.Read ();

        }

Izvedbo področja predmetov po meri lahko spremenite tako, da omogočite branje najmanjše in največje velikosti področja iz konfiguracijske datoteke. Kot del inicializacije področja predmetov lahko tudi zagotovite, da bazen vsebuje najmanjše število predmetov v njem.

Skupine predmetov pomagajo zmanjšati neobremenjene vire, ko potrebujete več primerkov razreda, ki jih je drago ustvarjati ali upravljati. Če vaša aplikacija vedno znova ustvari primerke za iste razrede, uporabite ta vzorec načrtovanja, da zagotovite optimalno delovanje.

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