Cara menggunakan pola desain prototipe di .NET

Pola desain digunakan untuk memecahkan masalah yang berulang dan kompleksitas dalam pengembangan perangkat lunak. Pola prototipe termasuk dalam kategori pola desain kreasi dan digunakan untuk membuat tiruan dari suatu objek. Pola desain kreasi berkaitan dengan pembuatan objek dan mengelola proses pembuatan objek dalam aplikasi Anda. Contoh khas dari pola desain yang termasuk dalam kategori pola kreasi meliputi pabrik abstrak, pembangun, metode pabrik, prototipe, dan pola tunggal.

Pola desain prototipe memungkinkan Anda membuat instance baru kelas dari instance yang sudah ada. Anda dapat memanfaatkan pola desain ini untuk membuat tiruan dari suatu objek ketika proses pembuatan objek itu sendiri adalah urusan yang mahal. Perhatikan bahwa kloning didefinisikan sebagai proses membuat salinan objek yang sama persis. Ada dua jenis kloning: salinan dalam dan salinan dangkal.

Salinan dangkal vs. kloning salinan dalam

Salinan dangkal dilakukan menggunakan metode Object.MemberwiseClone dan menyalin bidang non-statis dari suatu objek, sedangkan salinan dalam digunakan untuk menyalin tipe referensi dan nilai dan memberi Anda contoh yang berbeda pada objek. Anda dapat mempelajari salinan lebih dalam dan salinan dangkal dari artikel saya di sini.

Para peserta (kelas dan objek) dalam implementasi tipikal pola prototipe meliputi:

  • Prototipe - ini mendefinisikan antarmuka untuk kloning itu sendiri
  • ConcretePrototype - ini mendefinisikan tipe yang mengimplementasikan operasi kloning itu sendiri
  • Klien - ini mendefinisikan konsumen yang dapat membuat instance baru dengan menggandakan prototipe

Dengan mengingat hal ini, kami akan menerapkan pola prototipe di sini menggunakan tiga jenis. Ini termasuk yang berikut:

  • Pelanggan
  • CustomerManager
  • CustomerPrototype

Buat kelas abstrak prototipe di .NET

Lihat kelas CustomerPrototype yang diberikan di bawah ini.

[Dapat berseri ()]

kelas abstrak publik CustomerPrototype

    {

        public abstract CustomerPrototype Clone (bool performDeepCopy);

    }

Kelas CustomerPrototype bersifat abstrak dan berisi satu metode abstrak bernama Clone. Metode ini menerima parameter boolean bernama performDeepCopy. Jika parameter yang diteruskan ke itu benar, itu akan melakukan salinan dalam, salinan dangkal sebaliknya.

Buat kelas prototipe konkret di .NET

Kelas CustomerManager diberikan berikutnya. Ini berisi Kamus yang menyimpan instance kelas Pelanggan (itu hanyalah kelas POCO lain) di dalamnya. Ini juga berisi pengindeks bernama CustomerPrototype. Properti set pengindeks digunakan untuk menyimpan data ke dalam contoh Kamus bernama pelanggan.

  public class CustomerManager

    {

     pelanggan kamus pribadi = kamus baru ();

        public CustomerPrototype ini [int index]

        {

            dapatkan {return customers [index]; }

            setel {customers.Add (index, value); }

        }

    }

Buat kelas klien prototipe di .NET

Kelas Pelanggan diberikan berikutnya. Ini berisi dua properti, yaitu FirstName dan LastName, dan dua metode, Clone dan DeepCopy.

[Dapat berseri ()]

    public class Customer: CustomerPrototype

    {

        string publik FirstName

        {

            dapatkan; set;

        }

        string publik LastName

        {

            Dapatkan; set;

        }

        public override CustomerPrototype Clone (bool deepClone)

        {

            saklar (deepClone)

            {

                kasus benar:

                    kembalikan this.DeepCopy (this) sebagai CustomerPrototype;

                kasus salah:

                    kembalikan this.MemberwiseClone () sebagai CustomerPrototype;

                default:

                    kembalikan this.MemberwiseClone () sebagai CustomerPrototype;

            }

        }

        Private T DeepCopy (T obj)

        {

           // Tulis kode di sini untuk melakukan deep copy.

        }

     }

Saya telah melewatkan kode sumber dari metode DeepCopy dalam daftar kode di atas karena sudah tersedia di artikel saya sebelumnya di sini.

Buat salinan mendalam dari sebuah objek di .NET

Cuplikan kode berikut mengilustrasikan bagaimana Anda dapat memanfaatkan kelas CustomerManager yang kita buat sebelumnya untuk melakukan salinan dalam.

CustomerManager customerManager = new CustomerManager ();

Pelanggan custObj1 = Pelanggan baru ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Pelanggan custObj2 = Pelanggan baru ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Customer customer = customerManager [0] .Clone (true) sebagai Customer;

Perhatikan bahwa kami telah mengirimkan "true" sebagai parameter ke metode Clone untuk melakukan salinan dalam.

Membuat salinan dangkal objek di .NET

Demikian pula, Anda dapat mengirimkan "false" sebagai parameter ke metode yang sama untuk melakukan penyalinan dangkal. Inilah cara Anda mencapai ini.

Customer customer = customerManager [0] .Clone (false) sebagai Customer;

Terakhir, berikut adalah kode lengkap metode Utama untuk referensi Anda.

static void Main (string [] args)

      {

      CustomerManager customerManager = new CustomerManager ();

      Pelanggan custObj1 = Pelanggan baru ();

      custObj1.FirstName = "Joydip";

      custObj1.LastName = "Kanjilal";

      customerManager [0] = custObj1;

      Pelanggan custObj2 = Pelanggan baru ();

      custObj2.FirstName = "Stephen";

      custObj2.LastName = "Smith";

      customerManager [1] = custObj2;

      Customer customer = customerManager [0] .Clone (true) sebagai Customer;

      Console.ReadKey ();

      }