Προγραμματισμός

Πώς να χρησιμοποιήσετε το πρότυπο σχεδίασης πρωτοτύπου στο .NET

Τα πρότυπα σχεδιασμού χρησιμοποιούνται για την επίλυση επαναλαμβανόμενων προβλημάτων και πολυπλοκότητας στην ανάπτυξη λογισμικού. Το πρωτότυπο μοτίβο ανήκει στην κατηγορία δημιουργικών σχεδίων σχεδιασμού και χρησιμοποιείται για τη δημιουργία κλώνου ενός αντικειμένου. Τα σχέδια δημιουργικής σχεδίασης ασχολούνται με τη δημιουργία αντικειμένων και τη διαχείριση της διαδικασίας δημιουργίας αντικειμένων στην εφαρμογή σας. Τυπικά παραδείγματα μοτίβων σχεδιασμού που εμπίπτουν στην κατηγορία δημιουργικών μοτίβων περιλαμβάνουν τα αφηρημένα μοτίβα εργοστασίου, οικοδόμου, εργοστασιακής μεθόδου, πρωτοτύπου και μονού.

Το πρότυπο σχεδίασης πρωτοτύπου σάς επιτρέπει να δημιουργήσετε μια νέα παρουσία μιας κλάσης από μια υπάρχουσα παρουσία. Μπορείτε να επωφεληθείτε από αυτό το σχέδιο σχεδίασης για να δημιουργήσετε έναν κλώνο ενός αντικειμένου όταν η ίδια η διαδικασία δημιουργίας αντικειμένων είναι μια δαπανηρή υπόθεση. Σημειώστε ότι η κλωνοποίηση ορίζεται ως η διαδικασία δημιουργίας ενός ακριβούς αντιγράφου ενός αντικειμένου. Υπάρχουν δύο τύποι κλωνοποίησης: βαθύ αντίγραφο και ρηχό αντίγραφο.

Ρηχό αντίγραφο έναντι της κλωνοποίησης σε βάθος αντιγράφου

Το ρηχό αντίγραφο εκτελείται χρησιμοποιώντας τη μέθοδο Object.MemberwiseClone και αντιγράφει τα μη στατικά πεδία ενός αντικειμένου, ενώ το βαθύ αντίγραφο χρησιμοποιείται για την αντιγραφή τόσο των τύπων αναφοράς όσο και των τιμών και σας δίνει μια ξεχωριστή παρουσία σε ένα αντικείμενο. Μπορείτε να μάθετε περισσότερα σε βάθος αντίγραφο και ρηχό αντίγραφο από το άρθρο μου εδώ.

Οι συμμετέχοντες (τάξεις και αντικείμενα) σε μια τυπική εφαρμογή του πρωτοτύπου μοτίβου περιλαμβάνουν τα ακόλουθα:

  • Πρωτότυπο - αυτό ορίζει μια διεπαφή για την κλωνοποίηση
  • ConcretePrototype - ορίζει έναν τύπο που εφαρμόζει τη λειτουργία για την ίδια την κλωνοποίηση
  • Πελάτης - αυτό καθορίζει τον καταναλωτή που μπορεί να δημιουργήσει μια νέα παρουσία κλωνοποιώντας ένα πρωτότυπο

Έχοντας αυτό κατά νου, θα εφαρμόσουμε εδώ το πρωτότυπο μοτίβο χρησιμοποιώντας τρεις τύπους. Αυτά περιλαμβάνουν τα ακόλουθα:

  • Πελάτης
  • Διαχειριστής πελατών
  • Πρότυπο πελάτη

Δημιουργήστε ένα πρωτότυπο αφηρημένο μάθημα στο .NET

Ανατρέξτε στην κατηγορία CustomerPrototype που δίνεται παρακάτω.

[Δυνατότητα σειριοποίησης ()]

δημόσια αφηρημένη κλάση CustomerPrototype

    {

δημόσια περίληψη CustomerPrototype Clone (bool performDeepCopy);

    }

Η κλάση CustomerPrototype είναι αφηρημένη και περιέχει μια αφηρημένη μέθοδο που ονομάζεται Clone. Αυτή η μέθοδος δέχεται μια δυαδική παράμετρο που ονομάζεται performDeepCopy. Εάν η παράμετρος που μεταβιβάζεται σε αυτήν είναι αληθινή, θα εκτελέσει ένα αντίγραφο σε βάθος, ρηχό αντίγραφο διαφορετικά.

Δημιουργήστε μια συγκεκριμένη κατηγορία πρωτοτύπων στο .NET

Η κλάση CustomerManager δίνεται στη συνέχεια. Περιέχει ένα λεξικό που αποθηκεύει τις εμφανίσεις της κλάσης πελατών (είναι απλώς μια άλλη κλάση POCO) μέσα σε αυτήν. Περιέχει επίσης ένα ευρετήριο που ονομάζεται CustomerPrototype. Η καθορισμένη ιδιότητα του ευρετηρίου χρησιμοποιείται για την αποθήκευση δεδομένων στην παρουσία λεξικού με όνομα πελάτες.

  CustomerManager δημόσιας τάξης

    {

πελάτες ιδιωτικών λεξικών = νέο λεξικό ();

δημόσιος πελάτηςΠροτυπώστε αυτό το [int index]

        {

λήψη {επιστροφής πελατών [ευρετήριο] · }

ορίστε {customers.Add (index, value); }

        }

    }

Δημιουργήστε μια πρωτότυπη κλάση πελάτη στο .NET

Η κλάση πελατών δίνεται στη συνέχεια. Περιέχει δύο ιδιότητες, το FirstName και το LastName, και δύο μεθόδους, το Clone και το DeepCopy.

[Δυνατότητα σειριοποίησης ()]

δημόσια τάξη Πελάτης: CustomerPrototype

    {

δημόσια συμβολοσειρά FirstName

        {

ετοιμάσου;

        }

δημόσια συμβολοσειρά LastName

        {

παίρνω; σειρά;

        }

δημόσια παράκαμψη CustomerProtype Clone (bool deepClone)

        {

διακόπτης (deepClone)

            {

αλήθεια:

επιστρέψτε αυτό. DeepCopy (αυτό) ως CustomerPrototype;

λανθασμένη υπόθεση:

επιστρέψτε αυτό.MemberwiseClone () ως CustomerPrototype;

Προκαθορισμένο:

επιστρέψτε αυτό.MemberwiseClone () ως CustomerPrototype;

            }

        }

ιδιωτικό T DeepCopy (T obj)

        {

// Γράψτε κώδικα εδώ για να πραγματοποιήσετε αντιγραφή σε βάθος.

        }

     }

Έχω παραλείψει τον πηγαίο κώδικα της μεθόδου DeepCopy στην παραπάνω λίστα κωδικών, καθώς είναι ήδη διαθέσιμος στο προηγούμενο άρθρο μου εδώ.

Δημιουργήστε ένα βαθύ αντίγραφο ενός αντικειμένου στο .NET

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να επωφεληθείτε από την κλάση CustomerManager που δημιουργήσαμε νωρίτερα για να εκτελέσετε ένα αντίγραφο σε βάθος.

CustomerManager customerManager = νέο CustomerManager ();

Πελάτης custObj1 = νέος πελάτης ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Πελάτης custObj2 = νέος πελάτης ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Πελάτης πελάτη = customerManager [0]. Κλώνος (true) ως πελάτης;

Σημειώστε ότι έχουμε μεταβιβάσει το "true" ως παράμετρο στη μέθοδο Clone για να εκτελέσουμε ένα αντίγραφο σε βάθος.

Δημιουργήστε ένα ρηχό αντίγραφο ενός αντικειμένου στο .NET

Ομοίως, θα μπορούσατε να περάσετε το "false" ως παράμετρο στην ίδια μέθοδο για να εκτελέσετε ένα ρηχό αντίγραφο. Δείτε πώς μπορείτε να το πετύχετε αυτό.

Πελάτης πελάτη = customerManager [0]. Κλώνος (false) ως πελάτης;

Τέλος, εδώ είναι ο πλήρης κωδικός της κύριας μεθόδου για την αναφορά σας.

static void Main (συμβολοσειρά [] args)

      {

CustomerManager customerManager = νέο CustomerManager ();

Πελάτης custObj1 = νέος πελάτης ();

custObj1.FirstName = "Joydip";

custObj1.LastName = "Kanjilal";

customerManager [0] = custObj1;

Πελάτης custObj2 = νέος πελάτης ();

custObj2.FirstName = "Stephen";

custObj2.LastName = "Smith";

customerManager [1] = custObj2;

Πελάτης πελάτη = customerManager [0]. Κλώνος (true) ως Πελάτης;

Κονσόλα.ReadKey ();

      }