Notes d'étude sur le mode de conception --- 5. Mode prototype

  • Le modèle de prototype (modèle de prototype) est utilisé pour créer des objets répétés, tout en garantissant les performances. Ce type de modèle de conception est un modèle de création, qui fournit un moyen optimal de créer des objets;

  • Ce modèle implémente une interface prototype utilisée pour créer un clone de l'objet actuel; ce modèle est utilisé lorsque le coût de création directe d'un objet est relativement élevé. Par exemple, un objet doit être créé après une opération d'entrepôt de données coûteuse. Nous pouvons mettre ce jeu en cache; à la prochaine demande, retourner son clone et mettre à jour la base de données si nécessaire pour réduire les appels de base de données

  • Intention: utiliser des instances de prototype pour spécifier les types d'objets créés et créer de nouveaux objets en copiant ces prototypes;

  • Solution principale: construire et supprimer des prototypes en fonctionnement;

  • Quand utiliser:

    • 1. Quand un système doit être créé, composé et représenté indépendamment de ses produits;

    • 2. Lorsque la classe à instancier est spécifiée au moment de l'exécution, par exemple, via un chargement dynamique;

    • 3. Pour éviter de créer un niveau de classe d'usine parallèle au niveau de classe de produit;

    • 4. Lorsqu'une instance d'une classe ne peut avoir qu'une combinaison de plusieurs états différents. Il peut être plus pratique de construire un nombre correspondant de prototypes et de les cloner que d'instancier manuellement la classe dans l'état approprié à chaque fois;

  • Résolution: utilisez un objet prototype existant pour générer rapidement la même instance que l'objet prototype;

  • Code clé:

    • 1. Pour réaliser le clonage, hériter de Cloneable en Java et remplacer clone (). Dans .net, vous pouvez utiliser la méthode ObjectwiseClone () de la classe Object pour obtenir une copie superficielle des objets ou une copie complète par sérialisation;

    • 2. Le mode prototype est également utilisé pour isoler la relation de couplage entre les utilisateurs d'objets de classe et les classes concrètes (classes variables). Il faut également que ces "classes variables" aient des interfaces stables

  • Exemples d'application:

    • 1. Division cellulaire;

    • 2. Méthode Object clone () en Java;

  • Avantages:

    • 1. Amélioration des performances;

    • 2. Échapper aux contraintes de la fonction mécanisme;

  • Inconvénients:

    • 1. Équipé de méthodes de clonage, il est nécessaire de considérer les fonctions de classe en général. Ce n'est pas difficile pour les nouvelles classes, mais ce n'est pas facile pour les classes existantes, surtout quand une référence ne prend pas en charge les objets indirects sérialisés, ou la référence contient des cycles Temps structurel

    • 2. Doit implémenter une interface clonable;

  • Scénario d'utilisation:

    • 1. Scénarios d'optimisation des ressources;

    • 2. L'initialisation de classe a besoin de digérer beaucoup de ressources, cette ressource comprend des données, des ressources matérielles, etc.;

    • 3. Scénarios pour les exigences de performance et de sécurité;

    • 4. La création d'un objet à travers de nouveaux nécessite une préparation des données ou des droits d'accès très lourds, vous pouvez utiliser le mode prototype;

    • 5. Une scène où plusieurs modifications sont apportées à un objet;

    • 6. Un objet Xu Tao donne accès à d'autres jeux, et lorsque l'appelant peut avoir besoin de modifier sa valeur, vous pouvez envisager d'utiliser le mode prototype pour copier plusieurs objets à utiliser par l'appelant;

    • 7. Dans les projets réels, le modèle prototype apparaît rarement seul et apparaît généralement avec le modèle d'usine. Un objet est créé par la méthode de clonage, puis la méthode d'usine est fournie à l'appelant;

    • Remarque: contrairement à la construction de nouveaux objets en instanciant une classe, le mode prototype génère de nouveaux objets en copiant un objet existant. La copie superficielle implémente Cloneable, la réécriture et la copie profonde implémente Sérialisable pour lire le flux binaire ;

  • Combat réel:

    • Nous allons créer une forme abstraite et une classe d'entité qui étend la classe Shape; l'étape suivante consiste à définir la classe ShapeCache, qui stocke les objets de forme dans un HashTable et retourne leurs clones à la demande;

    • PrototypePatternDemo, la classe que nous montrons utilise la classe ShapeCache pour obtenir des objets Shape;

 

package prototype;

/**
 * @author yangxin_ryan
 */
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;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException{
        Object clone = null;
        clone = super.clone();
        return super.clone();
    }
}
package prototype;

/**
 * @author yangxin_ryan
 */
public class Rectangle extends Shape {

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

    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}
package prototype;

/**
 * @author yangxin_ryan
 */
public class Square extends Shape {

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

    @Override
    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}
package prototype;

/**
 * @author yangxin_ryan
 */
public class Circle extends Shape {
    public Circle() {
        type = "Circle";
    }

    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}
package prototype;

import java.util.Hashtable;

/**
 * @author yangxin_ryan
 */
public class ShapeCache {

    private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>();

    public static Shape getShape(String shapeId) throws Exception {
        Shape cachedShape = shapeMap.get(shapeId);
        return (Shape)cachedShape.clone();
    }

    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 prototype;

/**
 * @author yangxin_ryan
 */
public class PrototypePatternDemo {

    public static void main(String[] args) throws Exception{
        ShapeCache.loadCache();
        Shape clonedShape = (Shape)ShapeCache.getShape("1");
        System.out.println("Shape : " + clonedShape.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());
    }
}

 

Publié en 1980 articles originaux · loué 708 · 3,66 millions de vues +

Je suppose que tu aimes

Origine blog.csdn.net/u012965373/article/details/105643127
conseillé
Classement