Cara menggunakan pola desain kumpulan objek di C #

Saat membangun aplikasi, Anda sering menjumpai objek yang cukup mahal untuk dibuat. Dalam beberapa skenario, biaya pembuatan objek baru cukup tinggi untuk mempengaruhi kinerja aplikasi. Di sinilah pola desain kumpulan objek membantu. 

Pola desain kumpulan objek adalah pola desain kreasi yang digunakan untuk mendaur ulang objek daripada membuatnya kembali setiap kali aplikasi membutuhkannya. Dengan menyimpan contoh objek yang dapat digunakan kembali dalam kumpulan sumber daya, dan membagikannya sesuai kebutuhan, pola ini membantu meminimalkan overhead inisialisasi, pembuatan instance, dan pembuangan objek dan untuk meningkatkan kinerja aplikasi Anda.

Ketika aplikasi meminta sebuah objek, dan objek tersebut tersedia dari pool, itu dikembalikan dari pool. Jika objek dari tipe yang diminta tidak tersedia dari pool, maka instance baru dari objek tersebut dibuat dan dikembalikan. Ketika aplikasi tidak lagi membutuhkan objek, objek tersebut dikirim kembali ke pool.

Jumlah minimum dan maksimum objek yang dapat ditampung oleh kumpulan objek dapat dikonfigurasi. Jika aplikasi memerlukan objek dari kumpulan tetapi jumlah maksimum objek telah dialokasikan, implementasi kumpulan objek khusus yang khas dapat mengadopsi satu atau lebih dari strategi berikut:

  1. Kembalikan nol atau lempar pengecualian
  2. Blokir panggilan hingga objek tersedia
  3. Tingkatkan ukuran kolam untuk menampung lebih banyak objek

Kumpulan objek mirip dengan kumpulan koneksi database. Sama seperti kumpulan koneksi mengontrol jumlah maksimum koneksi ke database, kumpulan objek mengontrol jumlah instance kelas yang akan digunakan aplikasi.

Membuat kumpulan objek generik di C #

Sekarang setelah kita mengetahui dasar-dasarnya, mari beralih ke penerapan. Saat menerapkan pola desain kumpulan objek, kita perlu mempertimbangkan kegunaan kembali, kesederhanaan, konfigurasi, dan bahkan faktor-faktor seperti keamanan utas.

Dalam contoh ini kita akan memanfaatkan ConcurrentBag kelas untuk menyimpan objek. Perhatikan bahwa ConcurrentBagkelas dalam System.Collections.Concurrentnamespace menyediakan kumpulan elemen yang bebas kunci, aman utas, dan tidak berurutan. Perhatikan juga bahwa penyisipan dan penghapusan objek ke dan dari a ConcurrentBagsangat cepat — terutama jika utas yang sama mencoba menyisipkan dan menghapus item dari koleksi pada saat yang bersamaan.

Berikut adalah struktur ObjectPoolkelas khusus kami . Perhatikan penggunaan ConcurrentBaginstance untuk menyimpan objek.

kelas publik ObjectPool dimana T: new ()

    {

        private readonly ConcurrentBag items = new ConcurrentBag ();

        penghitung int pribadi = 0;

        int pribadi MAX = 10;

        Rilis public void (item T)

        {

            //MELAKUKAN          

        }

        publik T Dapatkan ()

        {

           //MELAKUKAN

        }

    }

Cuplikan kode berikut mengilustrasikan implementasi Getmetode. The Getmetode mengembalikan sebuah instance dari objek kolam renang jika tersedia. Jika tidak ada yang tersedia, objek baru dibuat dan dikembalikan. Dalam kedua skenario ini, countervariabel dinaikkan atau diturunkan sesuai kebutuhan. Perhatikan bahwa karena kita menggunakan koleksi serentak, misalnya, ConcurrentBagdalam contoh ini, konkurensi diurus.

publik T Dapatkan ()

        {

            T item;

            if (item.TryTake (item keluar))

            {

                melawan-;

                barang yang dikembalikan;

            }

            lain

            {

                T obj = T baru ();

                item.Add (obj);

                counter ++;

                return obj;

            }

        }

The MAXvariabel integer keras-kode di sini, tapi Anda bisa membuatnya dikonfigurasi. Kelas ini tidak tertutup atau statis, jadi Anda dapat memperluasnya sesuka Anda.

The Releasemetode yang digunakan untuk melepaskan benda-benda yang tidak lagi diperlukan kembali ke objek kolam renang. Ia memeriksa apakah nilai countervariabel lebih kecil dari nilai MAXvariabel, dan jika demikian, menambahkan objek yang diteruskan ke sana sebagai parameter ke koleksi.

Rilis public void (item T)

        {

            jika (penghitung <MAX)

            {

                item.Add (item);

                counter ++;

            }           

        }

Dengan asumsi bahwa Anda telah membuat kelas yang disebut MyClass, berikut adalah cara menambahkannya ke kumpulan objek menggunakan ObjectPoolkelas tersebut.

static void Main (string [] args)

        {

            ObjectPool objPool = new ObjectPool ();

            MyClass obj = objPool.Get ();

            objPool.Release (obj);

            Console.Read ();

        }

Anda dapat mengubah implementasi kumpulan objek khusus ini untuk memungkinkan ukuran minimum dan maksimum kumpulan untuk dibaca dari file konfigurasi. Sebagai bagian dari inisialisasi kumpulan objek, Anda juga dapat memastikan bahwa kumpulan berisi jumlah minimum objek di dalamnya.

Kumpulan objek membantu mengurangi overhead sumber daya saat Anda membutuhkan beberapa instance kelas yang mahal untuk dibuat atau dikelola. Jika aplikasi Anda melibatkan pembuatan instance kelas yang sama berulang kali, gunakan pola desain ini untuk memastikan kinerja yang optimal.