Cara menggunakan corak reka bentuk kumpulan objek di C #

Semasa membuat aplikasi, anda sering menemui objek yang agak mahal untuk dibuat. Dalam beberapa senario, kos membuat objek baru cukup tinggi untuk mempengaruhi prestasi aplikasi. Di sinilah corak reka bentuk kumpulan objek untuk menyelamatkan. 

Corak reka bentuk kumpulan objek adalah corak reka bentuk kreasi yang digunakan untuk mengitar semula objek dan bukannya membuat semula setiap kali aplikasi memerlukannya. Dengan menyimpan contoh objek yang dapat digunakan kembali di kumpulan sumber, dan membuangnya sesuai keperluan, corak ini membantu meminimumkan overhead untuk memulai, membuat, dan membuang objek dan untuk meningkatkan prestasi aplikasi anda.

Apabila aplikasi meminta objek, dan objek tersedia dari kolam, itu dikembalikan dari kolam. Sekiranya objek dari jenis yang diminta tidak tersedia dari kolam, maka contoh baru objek dibuat dan dikembalikan. Apabila aplikasi tidak lagi memerlukan objek, objek tersebut dikirim kembali ke kolam.

Bilangan minimum dan maksimum objek yang dapat ditampung oleh kumpulan objek dapat dikonfigurasi. Sekiranya aplikasi memerlukan objek dari kumpulan tetapi jumlah objek maksimum telah dialokasikan, implementasi kumpulan objek khusus dapat menggunakan satu atau lebih strategi berikut:

  1. Kembalikan nol atau buang pengecualian
  2. Sekat panggilan sehingga objek tersedia
  3. Tingkatkan ukuran kolam untuk menampung lebih banyak objek

Kumpulan objek serupa dengan kumpulan sambungan pangkalan data. Sama seperti kumpulan sambungan mengawal bilangan maksimum sambungan ke pangkalan data, kumpulan objek mengawal jumlah contoh kelas yang akan digunakan oleh aplikasi.

Membuat kumpulan objek generik di C #

Sekarang setelah kita mengetahui asasnya, mari masuk ke dalam pelaksanaannya. Semasa melaksanakan corak reka bentuk kumpulan objek, kita perlu mempertimbangkan penggunaan semula, kesederhanaan, kebolehaturan, dan bahkan faktor seperti keselamatan benang.

Dalam contoh ini kita akan memanfaatkan ConcurrentBag kelas untuk menyimpan objek. Perhatikan bahawa ConcurrentBagkelas di System.Collections.Concurrentruang nama menyediakan koleksi elemen tanpa kunci, selamat utas, tanpa susunan. Perhatikan juga bahawa penyisipan dan penyingkiran objek ke dan dari ConcurrentBagsangat cepat - terutamanya jika benang yang sama cuba memasukkan dan mengeluarkan barang dari koleksi pada masa yang sama.

Inilah struktur ObjectPoolkelas kebiasaan kami . Perhatikan penggunaan ConcurrentBagcontoh untuk menyimpan objek.

ObjectPool kelas awam di mana T: baru ()

    {

        item ConcurrentBag peribadi yang dibaca = ConcurrentBag baru ();

        kaunter int peribadi = 0;

        int MAX peribadi = 10;

        pelepasan kekosongan awam (item T)

        {

            // UNTUK MELAKUKAN          

        }

        awam T Dapatkan ()

        {

           // UNTUK MELAKUKAN

        }

    }

Coretan kod berikut menggambarkan pelaksanaan Getkaedah. The GetCara mengembalikan sebuah contoh dari kolam objek jika tersedia. Sekiranya tidak ada, objek baru akan dibuat dan dikembalikan. Dalam kedua senario ini, counterpemboleh ubah ditingkatkan atau dikurangkan sesuai. Perhatikan bahawa kerana kami menggunakan koleksi serentak, iaitu, ConcurrentBagdalam contoh ini, kesesuaian dijaga.

awam T Dapatkan ()

        {

            Item T;

            jika (item.TryTake (item keluar))

            {

                kaunter—;

                pulangkan barang;

            }

            yang lain

            {

                T obj = baru T ();

                item. Tambah (obj);

                kaunter ++;

                kembali obj;

            }

        }

The MAXinteger ubah berkod keras di sini, tetapi anda boleh membuat ia boleh dikonfigurasikan. Kelas ini tidak dimeteraikan atau statik, jadi anda boleh melanjutkannya mengikut kehendak anda

The Releasekaedah yang digunakan untuk melepaskan objek yang tidak diperlukan lagi kembali ke kolam objek. Ia memeriksa apakah nilai counterpemboleh ubah kurang dari nilai MAXpemboleh ubah, dan jika demikian, menambahkan objek yang dilalui kepadanya sebagai parameter pada koleksi.

pelepasan kekosongan awam (item T)

        {

            jika (kaunter <MAX)

            {

                item. Tambah (item);

                kaunter ++;

            }           

        }

Dengan mengandaikan bahawa anda telah membuat kelas yang dipanggil MyClass, berikut adalah cara anda dapat menambahkannya ke kumpulan objek menggunakan ObjectPoolkelas.

kekosongan statik Utama (string [] args)

        {

            ObjectPool objPool = ObjectPool baru ();

            MyClass obj = objPool.Get ();

            objPool.Release (obj);

            Konsol. Baca ();

        }

Anda dapat mengubah pelaksanaan kumpulan objek khusus ini untuk memungkinkan ukuran minimum dan maksimum kolam dibaca dari file konfigurasi. Sebagai sebahagian dari inisialisasi kumpulan objek, Anda juga dapat memastikan kumpulan itu berisi jumlah minimum objek di dalamnya.

Kumpulan objek membantu mengurangkan overhead sumber apabila anda memerlukan banyak contoh kelas yang mahal untuk dibuat atau diuruskan. Sekiranya aplikasi anda melibatkan membuat kelas yang sama berulang kali, gunakan corak reka bentuk ini untuk memastikan prestasi yang optimum.