Kako koristiti obrazac dizajna spremišta objekata u C #

Prilikom izrade aplikacija često nailazite na predmete koje je prilično skupo izrađivati. U nekim scenarijima troškovi stvaranja novih objekata dovoljno su visoki da utječu na izvedbu aplikacije. Ovdje u pomoć dolazi obrazac dizajna bazena objekata. 

Uzorak dizajna spremišta objekata kreativni je uzorak dizajna koji se koristi za recikliranje objekata, a ne za ponovno stvaranje svaki put kad ih aplikacija treba. Čuvanjem ponovnih primjeraka objekata u spremištu resursa i doziranjem prema potrebi, ovaj obrazac pomaže smanjiti općenite troškove inicijalizacije, instanciranja i zbrinjavanja objekata i poboljšati performanse vaše aplikacije.

Kada aplikacija zatraži objekt, a objekt je dostupan iz spremišta, vraća se iz spremišta. Ako objekt traženog tipa nije dostupan iz spremišta, tada se kreira i vraća nova instanca objekta. Kada aplikacija više ne treba objekt, objekt se vraća natrag u spremište.

Minimalan i maksimalan broj objekata koje spremište objekata može sadržavati je moguće konfigurirati. Ako aplikaciji treba objekt iz spremišta, ali je dodijeljen maksimalan broj objekata, tipična implementacija prilagođenog spremišta objekata može usvojiti jednu ili više sljedećih strategija:

  1. Vrati nulu ili izbaci iznimku
  2. Blokirajte poziv dok objekt ne bude dostupan
  3. Povećajte veličinu bazena za smještaj više predmeta

Spremište objekata slično je spremištu veza baze podataka. Baš kao što spremište veza kontrolira maksimalan broj veza s bazom podataka, tako i spremište objekata kontrolira broj primjeraka klase koje će aplikacija koristiti.

Stvaranje generičkog spremišta objekata u C #

Sad kad znamo osnove, krenimo u implementaciju. Kad implementiramo obrazac dizajna spremišta objekata, moramo uzeti u obzir ponovnu upotrebu, jednostavnost, konfigurabilnost, pa čak i čimbenike kao što je sigurnost niti.

U ovom ćemo primjeru iskoristiti ConcurrentBag klasu za pohranu objekata. Imajte na umu da ConcurrentBagklasa u System.Collections.Concurrentprostoru imena nudi neuređenu, neuređenu kolekciju elemenata bez zaključavanja. Također imajte na umu da je umetanje i uklanjanje predmeta u i iz njega ConcurrentBagvrlo brzo - pogotovo ako ista nit istodobno pokušava umetnuti i ukloniti predmete iz zbirke.

Evo strukture naše prilagođene ObjectPoolklase. Imajte na umu upotrebu ConcurrentBaginstance za spremanje objekata.

javna klasa ObjectPool gdje je T: novo ()

    {

        privatne stavke ConcurrentBag samo za čitanje = new ConcurrentBag ();

        privatni brojač int = 0;

        privatni int MAX = 10;

        javno void izdanje (T stavka)

        {

            //NAPRAVITI          

        }

        javni T Get ()

        {

           //NAPRAVITI

        }

    }

Sljedeći isječak koda ilustrira provedbu Getmetode. GetMetoda vraća instancu iz objekta bazena, ako je dostupna. Ako nijedan nije dostupan, kreira se i vraća novi objekt. U oba ova scenarija countervarijabla se prema potrebi povećava ili smanjuje. Imajte na umu da, jer koristimo istodobnu kolekciju, tj., ConcurrentBagU ovom primjeru, brine se o istodobnosti.

javni T Get ()

        {

            T stavka;

            if (items.TryTake (out item))

            {

                brojač-;

                predmet povrata;

            }

            drugo

            {

                T obj = novi T ();

                stavke.Add (obj);

                brojač ++;

                povratak obj;

            }

        }

MAXCjelobrojna varijabla je kodirana ovdje, ali možete to učiniti konfigurirati. Ova klasa nije zapečaćena ili statična, pa je možete proširiti kako želite.

ReleaseMetoda se koristi za puštanje predmeta koji više nisu potrebne leđa objekta bazen. Provjerava je li vrijednost countervarijable manja od vrijednosti MAXvarijable, a ako je tako, dodaje objekt koji joj je proslijeđen kao parametar u zbirku.

javno void izdanje (T stavka)

        {

            ako (brojač <MAX)

            {

                stavke.Dodaj (stavka);

                brojač ++;

            }           

        }

Pod pretpostavkom da ste stvorili klasu koja se zove MyClass, evo kako je možete dodati u spremište objekata pomoću ObjectPoolklase.

statička praznina Main (string [] args)

        {

            ObjectPool objPool = novi ObjectPool ();

            MyClass obj = objPool.Get ();

            objPool.Release (obj);

            Console.Read ();

        }

Možete izmijeniti ovu prilagođenu implementaciju spremišta objekata kako biste omogućili čitanje minimalne i maksimalne veličine spremišta iz konfiguracijske datoteke. Kao dio inicijalizacije spremišta objekata, također možete osigurati da spremište sadrži minimalni broj objekata u sebi.

Skupine objekata pomažu u smanjenju dodatnih troškova kada trebate više primjeraka klase koje je skupo stvoriti ili upravljati njima. Ako vaša aplikacija uključuje instanciranje istih klasa uvijek iznova, upotrijebite ovaj obrazac dizajna kako biste osigurali optimalne performanse.