Programmering

Sådan bruges objektmønsteret i C #

Når du bygger applikationer, støder du ofte på objekter, der er ret dyre at skabe. I nogle scenarier er omkostningerne ved at oprette nye objekter høje nok til at påvirke applikationsydelsen. Her er hvor mønsteret til objektpuljedesign kommer til undsætning.

Objektpooldesignmønsteret er et skabelsesmønster, der bruges til at genbruge objekter i stedet for at genskabe dem hver gang applikationen har brug for dem. Ved at opbevare genanvendelige forekomster af objekter i en ressourcepulje og uddele dem efter behov hjælper dette mønster med at minimere omkostningerne ved initialisering, instantiering og bortskaffelse af objekter og til at øge effektiviteten af ​​din applikation.

Når applikationen anmoder om et objekt, og objektet er tilgængeligt fra puljen, returneres det fra puljen. Hvis objektet af den ønskede type ikke er tilgængeligt fra puljen, oprettes og returneres en ny forekomst af objektet. Når applikationen ikke længere har brug for objektet, sendes objektet tilbage til puljen.

Det mindste og maksimale antal objekter, som en objektpulje kan indeholde, kan konfigureres. Hvis applikationen har brug for et objekt fra puljen, men det maksimale antal objekter er tildelt, kan en typisk brugerdefineret objektpoolimplementering vedtage en eller flere af følgende strategier:

  1. Returner null eller kast en undtagelse
  2. Bloker opkaldet, indtil et objekt er tilgængeligt
  3. Forøg poolstørrelsen for at rumme flere objekter

En objektpul svarer til databaseforbindelsespuljen. Ligesom forbindelsespuljen styrer det maksimale antal forbindelser til databasen, styrer objektpuljen antallet af klasseinstanser, som applikationen vil bruge.

Oprettelse af en generisk objektpulje i C #

Nu hvor vi kender det grundlæggende, lad os springe ind i implementeringen. Når vi implementerer objektmønsterets designmønster, skal vi overveje genanvendelighed, enkelhed, konfigurerbarhed og endda faktorer som trådsikkerhed.

I dette eksempel drager vi fordel af a ConcurrentBag klasse til at gemme genstande. Bemærk, at ConcurrentBag klasse i System.Collections.Concurrent navneområdet giver en låsefri, trådsikker, uordnet samling af elementer. Bemærk også, at indsættelse og fjernelse af genstande til og fra en ConcurrentBag er meget hurtig - især hvis den samme tråd prøver at indsætte og fjerne emner fra samlingen på samme tid.

Her er strukturen i vores skik ObjectPool klasse. Bemærk brugen af ConcurrentBag eksempel til opbevaring af objekterne.

offentlig klasse ObjectPool hvor T: ny ()

    {

private readonly ConcurrentBag-emner = nye ConcurrentBag ();

privat int-tæller = 0;

privat int MAX = 10;

offentlig ugyldig frigivelse (T-emne)

        {

//AT GØRE

        }

offentlig T Get ()

        {

//AT GØRE

        }

    }

Følgende kodestykke illustrerer en implementering af metode. Det metoden returnerer en forekomst fra objektpuljen, hvis en er tilgængelig. Hvis ingen er tilgængelige, oprettes og returneres et nyt objekt. I begge disse scenarier er tæller variabel øges eller formindskes efter behov. Bemærk, at fordi vi bruger en samtidig samling, dvs. ConcurrentBag i dette eksempel håndteres samtidighed.

offentlig T Get ()

        {

T-vare;

if (items.TryTake (out item))

            {

tæller—;

returvare;

            }

andet

            {

T obj = ny T ();

items.Tilføj (obj);

tæller ++;

returnere obj;

            }

        }

Det MAX heltalsvariabel er hårdkodet her, men du kan gøre den konfigurerbar. Denne klasse er ikke forseglet eller statisk, så du kan udvide den, som du vil.

Det Frigøre metoden bruges til at frigive objekter, der ikke længere er nødvendige, tilbage til objektpuljen. Den kontrollerer, om værdien af tæller variabel er mindre end værdien af MAX variabel, og tilføjer i så fald det objekt, der er sendt til det som en parameter til samlingen.

offentlig ugyldig frigivelse (T-emne)

        {

hvis (tæller <MAX)

            {

items.Add (item);

tæller ++;

            }           

        }

Forudsat at du har oprettet en klasse kaldet Min klasse, her er hvordan du kan føje det til objektpuljen ved hjælp af ObjectPool klasse.

statisk ugyldigt Main (streng [] args)

        {

ObjectPool objPool = ny ObjectPool ();

MyClass obj = objPool.Get ();

objPool.Release (obj);

Console.Read ();

        }

Du kan ændre denne brugerdefinerede objektpoolimplementering for at tillade, at poolens minimums- og maksimumstørrelser læses fra en konfigurationsfil. Som en del af initialiseringen af ​​objektpuljen kan du også sikre, at puljen indeholder det mindste antal objekter i den.

Objektpuljer hjælper med at reducere ressourceomkostninger, når du har brug for flere forekomster af en klasse, der er dyre at oprette eller administrere. Hvis din applikation indebærer at starte de samme klasser igen og igen, skal du bruge dette designmønster for at sikre optimal ydeevne.