Programavimas

Kaip naudoti objektų telkinio dizaino modelį C #

Kurdami programas dažnai susiduriate su objektais, kuriuos sukurti yra gana brangu. Kai kuriais atvejais naujų objektų kūrimo kaina yra pakankamai didelė, kad galėtų paveikti programos našumą. Čia gelbsti objekto baseino dizaino modelis.

Objektų telkinio dizaino modelis yra kūrybos dizaino modelis, naudojamas objektams perdirbti, o ne atkurti kiekvieną kartą, kai jų reikia programai. Laikydama daugkartinio naudojimo objektų egzempliorių išteklių telkinyje ir, jei reikia, juos pašalindama, ši schema padeda sumažinti objektų inicializavimo, greitinimo ir šalinimo pridėtines išlaidas ir padidinti jūsų programos našumą.

Kai programa pateikia užklausą dėl objekto ir objektas pasiekiamas iš baseino, jis grąžinamas iš baseino. Jei reikalaujamo tipo objekto nėra iš baseino, sukuriamas ir grąžinamas naujas objekto egzempliorius. Kai programai objekto nebereikia, objektas siunčiamas atgal į baseiną.

Konfigūruojamas mažiausias ir didžiausias objektų, kuriuos gali laikyti objektų telkinys, skaičius. Jei programai reikalingas objektas iš telkinio, bet priskirtas maksimalus objektų skaičius, tipinis pasirinktinių objektų telkinio diegimas gali pritaikyti vieną ar daugiau iš šių strategijų:

  1. Grąžinkite nulį arba išmeskite išimtį
  2. Blokuokite skambutį, kol bus pasiekiamas objektas
  3. Padidinkite baseino dydį, kad tilptų daugiau objektų

Objektų telkinys yra panašus į duomenų bazės ryšio telkinį. Lygiai taip pat, kaip ryšių telkinys valdo maksimalų ryšių su duomenų baze skaičių, objektų telkinys kontroliuoja klasės egzempliorių, kuriuos naudos programa, skaičių.

Bendrojo objektų telkinio sukūrimas C #

Dabar, kai žinome pagrindus, pereikime prie įgyvendinimo. Įgyvendindami objekto telkinio dizaino modelį, turime atsižvelgti į pakartotinį naudojimą, paprastumą, konfigūravimą ir netgi tokius veiksnius kaip siūlų sauga.

Šiame pavyzdyje pasinaudosime a „ConcurrentBag“ klasės daiktams laikyti. Atkreipkite dėmesį, kad „ConcurrentBag“ klasėje Sistema. Kolekcijos. Sutampa vardų sritis suteikia elementų kolekciją be užrakto, siūlų saugų, netvarkytą. Taip pat atkreipkite dėmesį, kad objektų įterpimas ir pašalinimas į ir iš „ConcurrentBag“ yra labai greitas, ypač jei ta pati gija vienu metu bando įterpti ir pašalinti elementus iš kolekcijos.

Čia yra mūsų papročio struktūra „ObjectPool“ klasė. Atkreipkite dėmesį į „ConcurrentBag“ objektų saugojimo pavyzdys.

viešoji „ObjectPool“ klasė, kurioje T: nauja ()

    {

privatūs tik skaitomi „ConcurrentBag“ elementai = naujas „ConcurrentBag“ ();

privatus int skaitiklis = 0;

privatus int MAX = 10;

viešas niekinis leidimas (T elementas)

        {

//DARYTI

        }

viešasis T Gauti ()

        {

//DARYTI

        }

    }

Šis kodo fragmentas iliustruoja, kaip įdiegta Gaukite metodas. Gaukite metodas grąžina egzempliorių iš objektų telkinio, jei toks yra. Jei nėra, sukuriamas ir grąžinamas naujas objektas. Abiem šiais scenarijais skaitiklis kintamasis yra atitinkamai padidintas arba sumažintas. Atkreipkite dėmesį, kad kadangi mes naudojame lygiagrečią kolekciją, t. „ConcurrentBag“ šiame pavyzdyje rūpinamasi tuo pačiu laiku.

viešasis T Gauti ()

        {

T prekė;

jei (punktai. Pabandykite (išimkite elementą))

            {

skaitiklis—;

grąžinti daiktą;

            }

Kitas

            {

T obj = naujas T ();

daiktai.Pridėti (obj);

skaitiklis ++;

grąžinimo obj;

            }

        }

MAKS čia sveikas kintamasis yra užkoduotas, bet jūs galite padaryti jį konfigūruojamą. Ši klasė nėra sandari ar statiška, todėl galite ją pratęsti taip, kaip jums patinka.

Atleiskite metodas naudojamas objektams, kurie nebereikalingi, išleisti atgal į objektų grupę. Jis tikrina, ar skaitiklis kintamasis yra mažesnis už MAKS kintamąjį ir, jei taip, prideda jam perduotą objektą kaip parametrą į kolekciją.

viešas niekinis leidimas (T elementas)

        {

jei (skaitiklis <MAX)

            {

elementai. Pridėti (elementas);

skaitiklis ++;

            }           

        }

Darant prielaidą, kad sukūrėte klasę, vadinamą Mano klasė, štai kaip galite jį pridėti prie objektų telkinio naudodami „ObjectPool“ klasė.

static void Main (string [] args)

        {

ObjectPool objPool = new ObjectPool ();

„MyClass“ obj = objPool.Get ();

objPool.Release (obj);

Pultas.Skaitykite ();

        }

Galite modifikuoti šį pritaikytą objektų telkinio diegimą, kad leistumėte iš konfigūracijos failo nuskaityti mažiausius ir didžiausius telkinio dydžius. Inicijuodami objektų telkinį, taip pat galite užtikrinti, kad telkinyje būtų minimalus objektų skaičius.

Objektų telkiniai padeda sumažinti išteklių pridėtines išlaidas, kai jums reikia kelių klasės egzempliorių, kuriuos sukurti ar valdyti yra brangu. Jei jūsų programoje vėl ir vėl išaiškinamos tos pačios klasės, naudokite šį dizaino modelį, kad užtikrintumėte optimalų našumą.