Programmering

Hvordan bruke objektbassengdesignmønsteret i C #

Når du bygger applikasjoner, kommer du ofte over gjenstander som er ganske dyre å lage. I noen scenarier er kostnadene ved å lage nye objekter høye nok til å påvirke applikasjonsytelsen. Her er hvor motivbassengets designmønster kommer til undsetting.

Objektbassengdesignmønsteret er et skapende designmønster som brukes til å resirkulere objekter i stedet for å gjenskape dem hver gang applikasjonen trenger dem. Ved å beholde gjenbrukbare forekomster av objekter i en ressurssamling og dele dem ut etter behov, hjelper dette mønsteret med å minimere overhead for initialisering, instantiering og avhending av objekter og for å øke ytelsen til applikasjonen.

Når applikasjonen ber om et objekt, og objektet er tilgjengelig fra bassenget, returneres det fra bassenget. Hvis objektet av den forespurte typen ikke er tilgjengelig fra bassenget, opprettes og returneres en ny forekomst av objektet. Når applikasjonen ikke lenger trenger objektet, sendes objektet tilbake til bassenget.

Det minste og maksimale antall objekter som en objektgruppe kan inneholde, kan konfigureres. Hvis applikasjonen trenger et objekt fra bassenget, men maksimalt antall objekter er tildelt, kan en typisk tilpasset objektpoolimplementering vedta en eller flere av følgende strategier:

  1. Returner null eller kast et unntak
  2. Blokkér samtalen til et objekt er tilgjengelig
  3. Øk bassengstørrelsen for å få plass til flere gjenstander

En objektgruppe ligner databaseforbindelsesbassenget. Akkurat som tilkoblingsbassenget styrer maksimalt antall tilkoblinger til databasen, kontrollerer objektgruppen antall klasseforekomster som applikasjonen vil bruke.

Opprette et generisk objektbasseng i C #

Nå som vi vet det grunnleggende, la oss hoppe inn i implementeringen. Når vi implementerer designmønsteret for objektbassenget, må vi vurdere gjenbrukbarhet, enkelhet, konfigurerbarhet og til og med faktorer som trådsikkerhet.

I dette eksemplet vil vi dra nytte av a ConcurrentBag klasse for å lagre gjenstander. Merk at ConcurrentBag klasse i System.Collections.Concurrent navneområdet gir en låsfri, trådsikker, uordnet samling av elementer. Vær også oppmerksom på at innsetting og fjerning av gjenstander til og fra en ConcurrentBag er veldig raskt - spesielt hvis den samme tråden prøver å sette inn og fjerne ting fra samlingen samtidig.

Her er strukturen til vår skikk ObjectPool klasse. Legg merke til bruken av ConcurrentBag eksempel for lagring av gjenstandene.

offentlig klasse ObjectPool der T: ny ()

    {

private readonly ConcurrentBag items = new ConcurrentBag ();

privat int-teller = 0;

privat int MAX = 10;

offentlig ugyldig utgivelse (T-element)

        {

//Å GJØRE

        }

offentlig T Get ()

        {

//Å GJØRE

        }

    }

Følgende kodebit illustrerer en implementering av metode. De metoden returnerer en forekomst fra objektbassenget hvis en er tilgjengelig. Hvis ingen er tilgjengelige, opprettes og returneres et nytt objekt. I begge disse scenariene er disk variabel økes eller reduseres etter behov. Merk at fordi vi bruker en samtidig samling, dvs. ConcurrentBag i dette eksemplet blir samtidig tatt vare på.

offentlig T Get ()

        {

T-element;

if (items.TryTake (ut element))

            {

disk-;

returvare;

            }

ellers

            {

T obj = ny T ();

items.Add (obj);

teller ++;

retur obj;

            }

        }

De MAX heltallvariabelen er hardkodet her, men du kan gjøre den konfigurerbar. Denne klassen er ikke forseglet eller statisk, så du kan utvide den som du vil.

De Utgivelse metoden brukes til å frigjøre objekter som ikke lenger er behov for tilbake til objektbassenget. Den sjekker om verdien på disk variabel er mindre enn verdien av MAX variabel, og i tilfelle tilføyer objektet som sendes til det som en parameter til samlingen.

offentlig annullering (T-element)

        {

hvis (teller <MAX)

            {

items.Add (element);

teller ++;

            }           

        }

Forutsatt at du har opprettet en klasse som heter Klassen min, her er hvordan du kan legge den til objektbassenget ved hjelp av ObjectPool klasse.

statisk tomrom Main (streng [] args)

        {

ObjectPool objPool = ny ObjectPool ();

MyClass obj = objPool.Get ();

objPool.Release (obj);

Console.Read ();

        }

Du kan endre denne egendefinerte implementeringen av objektbassenget slik at minimums- og maksimumsstørrelsen på bassenget kan leses fra en konfigurasjonsfil. Som en del av initialiseringen av objektbassenget kan du også sørge for at bassenget inneholder minimum antall objekter i det.

Objektbassenger bidrar til å redusere ressurskostnadene når du trenger flere forekomster av en klasse som er dyre å opprette eller administrere. Hvis søknaden din innebærer å sette i gang de samme klassene om og om igjen, bruk dette designmønsteret for å sikre optimal ytelse.

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