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:
- Palauta nolla tai heitä poikkeus
- Estä puhelu, kunnes objekti on käytettävissä
- 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.