Ohjelmointi

Objektivaraston suunnittelukuvion käyttäminen C #: ssä

Rakennettaessa sovelluksia törmäät usein esineisiin, joiden luominen on melko kallista. Joissakin tilanteissa uusien objektien luomiskustannukset ovat riittävän suuret vaikuttamaan sovelluksen suorituskykyyn. Tässä on objekti-altaan suunnittelumalli.

Objektivaraston suunnittelumalli on luova suunnittelumalli, jota käytetään objektien kierrättämiseen sen sijaan, että luodaan ne uudelleen aina, kun sovellus tarvitsee niitä. Pitämällä objektien uudelleenkäytettävät esiintymät resurssivarannossa ja poimimalla ne tarvittaessa pois, tämä malli auttaa minimoimaan esineiden alustamisen, instantisoinnin ja hävittämisen yleiskustannukset ja parantamaan sovelluksesi suorituskykyä.

Kun sovellus pyytää objektia ja objekti on käytettävissä poolista, se palautetaan poolista. Jos pyydettyä tyyppiä oleva objekti ei ole käytettävissä poolista, objektin uusi ilmentymä luodaan ja palautetaan. Kun sovellus ei enää tarvitse objektia, objekti lähetetään takaisin pooliin.

Kohdejoukon pitämien objektien vähimmäis- ja enimmäismäärä on määritettävissä. Jos sovellus tarvitsee objektin poolista, mutta objektien enimmäismäärä on varattu, tyypillinen mukautetun objektialueen toteutus voi käyttää yhtä tai useampaa seuraavista strategioista:

  1. Palauta nolla tai heitä poikkeus
  2. Estä puhelu, kunnes objekti on käytettävissä
  3. Lisää altaan kokoa, jotta siihen mahtuu enemmän esineitä

Objektivarasto on samanlainen kuin tietokantayhteysallas. Aivan kuten yhteyspooli ohjaa enimmäismäärää yhteyksiä tietokantaan, objektijoukko ohjaa sovelluksen käyttämien luokan ilmentymien määrää.

Yleisen objektijoukon luominen C #: een

Nyt kun tiedämme perusasiat, aloitetaan toteutus. Kun toteutamme objektialueen suunnittelumallia, meidän on otettava huomioon uudelleenkäytettävyys, yksinkertaisuus, konfiguroitavuus ja jopa tekijät, kuten langan turvallisuus.

Tässä esimerkissä hyödynnämme a SamanaikainenLaukku luokka esineiden tallentamiseen. Huomaa, että SamanaikainenLaukku luokka System.Collections.Concurrent nimitila tarjoaa lukittoman, langankestävän, järjestämättömän kokoelman elementtejä. Huomaa myös, että esineiden lisääminen ja poistaminen a SamanaikainenLaukku on erittäin nopea - varsinkin jos sama säie yrittää lisätä ja poistaa kohteita kokoelmasta samanaikaisesti.

Tässä on tapamme rakenne ObjectPool luokassa. Huomaa SamanaikainenLaukku esimerkiksi esineiden tallentamiseen.

public class ObjectPool missä T: uusi ()

    {

yksityiset vain luettavissa olevat samanaikaiset laukut = uusi samanaikainen laukku ();

yksityinen int-laskuri = 0;

yksityinen int MAX = 10;

julkinen mitätön julkaisu (T-kohde)

        {

//TEHDÄ

        }

julkinen T Get ()

        {

//TEHDÄ

        }

    }

Seuraava koodikatkelma kuvaa Saada menetelmä. Saada method palauttaa ilmentymän objektivarastosta, jos sellainen on käytettävissä. Jos mitään ei ole käytettävissä, uusi objekti luodaan ja palautetaan. Molemmissa näissä skenaarioissa laskuri muuttujaa suurennetaan tai vähennetään tarvittaessa. Huomaa, että koska käytämme samanaikaista kokoelmaa, SamanaikainenLaukku tässä esimerkissä huolehditaan samanaikaisuudesta.

julkinen T Get ()

        {

T-tuote;

jos (items.TryTake (out item))

            {

laskuri-;

palauttaa tuote;

            }

muu

            {

T obj = uusi T ();

items.Add (obj);

laskuri ++;

palata obj;

            }

        }

MAX kokonaisluku muuttuja on tässä koodattu kovakoodatulla tavalla, mutta voit tehdä siitä konfiguroitavan. Tämä luokka ei ole sinetöity tai staattinen, joten voit pidentää sitä haluamallasi tavalla.

Vapauta menetelmää käytetään vapauttamaan objektit, joita ei enää tarvita, takaisin objektivarastoon. Se tarkistaa onko arvo laskuri muuttuja on pienempi kuin arvon MAX muuttuja, ja jos on, lisää siihen välitetyn objektin parametrina kokoelmaan.

julkinen mitätön julkaisu (T-kohde)

        {

jos (laskuri <MAX)

            {

items.Add (item);

laskuri ++;

            }           

        }

Oletetaan, että olet luonut luokan nimeltä Luokkani, tässä on, miten voit lisätä sen objektivarastoon ObjectPool luokassa.

staattinen void Main (merkkijono [] args)

        {

ObjectPool objPool = uusi ObjectPool ();

Oma luokka obj = objPool.Get ();

objPool.Release (obj);

Konsoli.Lue ();

        }

Voit muokata tätä mukautettua objektiryhmän toteutusta sallimalla poolin vähimmäis- ja enimmäiskoon lukemisen kokoonpanotiedostosta. Osana objektialueen alustusta voit myös varmistaa, että poolissa on vähimmäismäärä esineitä.

Objektivarastot vähentävät resurssien yleiskustannuksia, kun tarvitset useita luokan esiintymiä, joiden luominen tai hallinta on kallista. Jos sovelluksessasi käytetään samojen luokkien uudistamista uudestaan ​​ja uudestaan, käytä tätä suunnittelumallia optimaalisen suorituskyvyn takaamiseksi.