Πρωτότυπο σχέδιο σχεδίασης | Java Development Journal

1
Πρωτότυπο σχέδιο σχεδίασης |  Java Development Journal

Σε αυτό το άρθρο σχεδίασης Java, θα εξετάσουμε το Πρωτότυπο σχέδιο σχεδίασης. ο Πρωτότυπο μοτίβο αποτελεί μέρος του Creational Design Pattern.

Πρωτότυπο σχέδιο σχεδίασης

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

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

Κλάση αντικειμένων clone() Η μέθοδος είναι ένα παράδειγμα σχεδίου πρωτοτύπου

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

1. Πώς να εφαρμόσετε το μοτίβο πρωτοτύπων

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

  • Δημιουργήστε μια πρωτότυπη διεπαφή και προσθέστε τη λειτουργία κλώνου σε αυτήν.
  • Μια εναλλακτική λειτουργία Object() για μια κλάση πρωτότυπου που δέχεται ένα αντικείμενο αυτής της κλάσης ως όρισμα πρέπει να οριστεί. Η λειτουργία Object() πρέπει να αντιγράψει τις τιμές όλων των πεδίων κλάσης στο νέο στιγμιότυπο από το αντικείμενο. Εάν ενημερώνετε μια υποκλάση, πρέπει να χρησιμοποιήσετε τη γονική συνάρτηση Object() να αναθέσει την κλωνοποίηση των ιδιωτικών πεδίων της στην υπερ-τάξη.
  • Η μέθοδος κλωνοποίησης συνήθως περιλαμβάνει μόνο μία γραμμή: κλήση ενός νέου χειριστή χρησιμοποιώντας την πρωτότυπη έκδοση του κατασκευαστή. Κάθε κλάση πρέπει να παρακάμψει τη μέθοδο κλωνοποίησης και να χρησιμοποιήσει το όνομα της κλάσης με τον νέο τελεστή. Διαφορετικά, η μέθοδος κλωνοποίησης μπορεί να δημιουργήσει ένα παιδί αντικείμενο.

Έτσι φαίνεται η συνολική σχέση:

Πρωτότυπα μοτίβο σχεδίασης
Μοτίβο σχεδίασης πρωτοτύπων

Ας δούμε κάποιο σημαντικό στοιχείο του παραπάνω UML

  • διεπαφή -> Οι τεχνικές κλωνοποίησης δηλώνονται στη διεπαφή. Συνήθως είναι μόνο μια μέθοδος κλώνου.
  • Κατηγορία σκυροδέματος -> Η μέθοδος κλωνοποίησης υλοποιείται από την κλάση Concrete Prototype. Εκτός από την αντιγραφή των δεδομένων του αρχικού αντικειμένου στον κλώνο, αυτή η μέθοδος μπορεί επίσης να χειριστεί ορισμένες περιπτώσεις ακμής της διαδικασίας κλωνοποίησης που σχετίζονται με την κλωνοποίηση συνδεδεμένων αντικειμένων, το ξεμπλέξιμο των αναδρομικών εξαρτήσεων κ.λπ., εκτός από την αντιγραφή των δεδομένων του αρχικού αντικειμένου στον κλώνο.
  • Κατηγορία Πελατών -> Η κλάση πελάτη θα χρησιμοποιήσει τη διεπαφή για να δημιουργήσει/να πάρει το αντίγραφο της κλάσης Concrete.

2. Πρωτότυπο μοτίβο σε Java

Έχουμε κατανοήσει τα βασικά του σχεδίου σχεδίου πρωτοτύπων. Ας εφαρμόσουμε το ίδιο χρησιμοποιώντας Java. Θα δημιουργήσουμε μια αφηρημένη τάξη που ονομάζεται Shapeκαθώς και συγκεκριμένα μαθήματα (Circle, Rectangle, Square) που το επεκτείνουν. Ως επόμενο βήμα, το ShapeCache ορίζεται η κλάση, η οποία αποθηκεύει αντικείμενα σχήματος στο α HashTable και επιστρέφει τον κλώνο τους όταν τους ζητηθεί.

Η δοκιμαστική μας τάξη, PrototypPatternDemoθα αποκτήσει ένα αντικείμενο Shape χρησιμοποιώντας το ShapeCache τάξη και επιστρέψτε τον κλώνο των συγκεκριμένων τάξεων. Έτσι θα μοιάζει ο κώδικας Java μας:

package javadevjournal.design.creational.prototype;

public abstract class Shape implements Cloneable {
    private String id;
    protected String type;
    abstract void draw();

    public String getType() {
        return type;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    /**
     * Use Object class's Clone() method to do the cloning.
     * @return
     */
    public Object clone() {
        Object cloneObject = null;
        try {
            cloneObject = super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println("cloning failed");
            e.printStackTrace();
        }
        return cloneObject;
    }
}

Δημιουργήστε συγκεκριμένες τάξεις που επεκτείνουν την παραπάνω αφηρημένη τάξη

package javadevjournal.design.creational.prototype;


public class Rectangle extends Shape {

    public Rectangle() {
        type = "Rectangle";
    }
    @Override
    public void draw() {
        System.out.println("Rectangle's draw() method.");
    }
}

//Square.java
package javadevjournal.design.creational.prototype;


public class Square extends Shape {

    public Square() {
        type = "Square";
    }

    @Override
    public void draw() {
        System.out.println("Square's draw() method.");
    }
}


//Circle.java
package javadevjournal.design.creational.prototype;


public class Circle extends Shape {

    public Circle() {
        type = "Circle";
    }

    @Override
    public void draw() {
        System.out.println("Circle's draw() method.");
    }
}

Δημιουργήστε μια κλάση που ανακτά συγκεκριμένες κλάσεις από τη βάση δεδομένων και τις αποθηκεύει σε ένα Hashtable:

Διαφημίσεις

package javadevjournal.design.creational.prototype;

import java.util.HashMap;
import java.util.Map;


public class ShapeCache {
    private static Map < String, Shape > shapeMap = new HashMap < String, Shape > ();

    /**
     * Return cloned object of Shape class implementing classes.
     * @param shapeId
     * @return
     */
    public static Shape getShape(String shapeId) {
        Shape toBeClonedShape = shapeMap.get(shapeId);
        return (Shape) toBeClonedShape.clone();
    }


    /**
     * In real-world applications, the loading of details will be from a Database.
     * We are using a HaspMap to demonstrate the same behavior.
     */
    public static void loadCache() {
        Circle circle = new Circle();
        circle.setId("1");
        shapeMap.put(circle.getId(), circle);

        Square square = new Square();
        square.setId("2");
        shapeMap.put(square.getId(), square);

        Rectangle rectangle = new Rectangle();
        rectangle.setId("3");
        shapeMap.put(rectangle.getId(), rectangle);
    }
}

Τέλος, τάξη επίδειξης:

package javadevjournal.design.creational.prototype;

public class PrototypePatternDemo {
    public static void main(String[] args) {
        ShapeCache.loadCache();

        Shape clonedShape1 = (Shape) ShapeCache.getShape("1");
        System.out.println("Shape : " + clonedShape1.getType());

        Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
        System.out.println("Shape : " + clonedShape2.getType());

        Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
        System.out.println("Shape : " + clonedShape3.getType());
    }
}

Εδώ είναι η έξοδος του κώδικα:

Παραγωγή

Διαφημίσεις

Αν είστε περίεργοι, έτσι συνδέονται όλες αυτές οι κλάσεις και η διεπαφή στο δικό μας Πρωτότυπο σχέδιο σχεδίασης.

Πρωτότυπο σχέδιο σχεδίασης
Πρωτότυπο σχέδιο σχεδίασης

Διαφημίσεις

3. Πλεονεκτήματα του Πρωτότυπου Μοτίβου

Ας δούμε μερικά πλεονεκτήματα από τη χρήση αυτού του μοτίβου

  • Προσθήκη και διαγραφή προϊόντων στη μέση ενός παιχνιδιού–Καταχωρίζοντας μια πρωτότυπη παρουσία στον πελάτη, μπορείτε εύκολα να ενσωματώσετε μια νέα κατηγορία προϊόντων συγκεκριμένου προϊόντος σε ένα σύστημα. Επειδή ένας πελάτης μπορεί να εγκαταστήσει και να απεγκαταστήσει πρωτότυπα κατά τη διάρκεια του χρόνου εκτέλεσης, αυτό το μοτίβο είναι λίγο πιο ευέλικτο από άλλα μοτίβα δημιουργίας.
  • Δημιουργία νέων αντικειμένων αλλάζοντας τις τιμές τους–Η σύνθεση αντικειμένων, αντί να εισάγετε νέες κλάσεις, σας επιτρέπει να σχεδιάσετε νέα συμπεριφορά σε εξαιρετικά δυναμικά συστήματα καθορίζοντας τιμές για τις μεταβλητές ενός αντικειμένου.
  • Δημιουργία νέων αντικειμένων αλλάζοντας τη δομή τους – Πολλές εφαρμογές δημιουργούν πράγματα από μέρη και υποτμήματα. Τέτοιες εφαρμογές σας επιτρέπουν συχνά να δημιουργείτε εξελιγμένες δομές που καθορίζονται από τον χρήστη για να επαναχρησιμοποιήσετε ένα μεμονωμένο υποκύκλωμα.
  • Πολλά σχέδια ξεκινούν με τη χρήση Εργοστασιακή μέθοδος (λιγότερο περίπλοκο και πιο προσαρμόσιμο μέσω υποκατηγοριών) και εξελισσόμαστε προς Αφηρημένο εργοστάσιο, Πρωτότυποή Οικοδόμος (πιο ευέλικτο, αλλά πιο περίπλοκο).

3.1. Μειονεκτήματα

  • Για ένα έργο με λίγα αντικείμενα ή/και καμία υποκείμενη έμφαση στην επέκταση των πρωτοτύπων αλυσίδων, αυτό είναι υπερβολικό.
  • Διατηρεί επίσης ορισμένες κατηγορίες προϊόντων κρυφές από τον πελάτη.
  • Όταν οι υπό εξέταση κλάσεις υπάρχουν ήδη, κάθε υποκατηγορία Πρωτότυπου πρέπει να υλοποιήσει το clone() συνάρτηση, η οποία μπορεί να είναι πολύπλοκη. Επίσης, όταν τα εσωτερικά τους περιλαμβάνουν αντικείμενα που δεν επιτρέπουν την αντιγραφή ή έχουν κυκλικές αναφορές, υλοποίηση clone() μπορεί να είναι προκλητική.

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

  • Κατά τη διάρκεια του χρόνου εκτέλεσης, όταν αρχίζουν οι κατηγορίες σκυροδέματος.
  • Όταν το κόστος παραγωγής ενός προϊόντος είναι απαγορευτικά υψηλό ή πολύπλοκο.
  • Όταν θέλετε να διατηρήσετε τις αιτήσεις σας, ο αριθμός των τάξεων στο ελάχιστο.
  • Όταν η εφαρμογή πελάτη δεν χρειάζεται να γνωρίζει για τη δημιουργία ή την αναπαράσταση αντικειμένου.

Περίληψη

Σε αυτή την ανάρτηση, μιλήσαμε για το Πρωτότυπο σχέδιο σχεδίασης. Είδαμε μερικά από τα παραδείγματα του πραγματικού κόσμου μαζί με ορισμένα πλεονεκτήματα της χρήσης αυτού του μοτίβου. Είδαμε επίσης μια υλοποίηση Java για αυτό το μοτίβο σχεδίασης. Μπορείτε πάντα να ελέγχετε το δικό μας Αποθετήριο GitHub για τον πιο πρόσφατο πηγαίο κώδικα.

Schreibe einen Kommentar