Question

J'ai été en passant par la conception du Prototype de modèle et a eu quelques questions.

J'ai compris le Prototype de modèle de conception est utilisé pour la création d'objets qui sont coûteux en termes de mémoire et de ressources.Dans ce cas, nous utilisons un clone de l'objet qui est déjà disponible.

Quelle est donc la différence entre la création d'un new objet et clone()?Où est l'objet stocké dans la mémoire?

Était-ce utile?

La solution

Prototype de modèle de conception offre des économies de coûts de deux types: des économies de temps et d'espace.

Gain de temps viennent dans des situations lors de la création d'un objet nécessite un coûteux l'accès à l'information auxiliaire - dire, en demandant des données de configuration à partir d'un fichier, une base de données ou sur un réseau.Par exemple, si vous êtes à la construction de beaucoup de pages à partir d'un modèle qui est stocké sur un serveur web, il est plus économique de lire le modèle une fois et de le cloner pour obtenir le point de départ de chaque nouvelle page, plutôt que d'interroger le serveur web séparément pour chaque page.

La mémoire des économies proviennent de la réutilisation des objets immuables:si votre document original contient beaucoup de chaînes, de la création d'une nouvelle instance serait nécessaire de créer entièrement de nouveaux immuable de chaînes, ou de traiter avec la chaîne de stage manuellement.En utilisant le prototype de modèle gracieusement évite ce problème en laissant le clone de la part de l'immuable parties du modèle.

Autres conseils

La Java clone() méthode crée un nouvel objet et de copies membre valeurs de la variable en elle.En général, c'est ni plus ni moins coûteuse que la création d'un nouvel objet.La seule fois clone() peut-être moins cher que la création d'un objet avec new lorsque le constructeur d'un objet ne quelque chose de cher:par exemple, si le constructeur a pris les arguments et de les utiliser dans le cadre d'une requête de base de données?Dans ce cas, à l'aide de clone() serait moins cher, que la coûteuse opération de requête ne serait pas le cas.

Il y a d'autres raisons d'utiliser ce modèle de conception si:surtout, lorsque les objets ont besoin d'installation compliquée avant de l'utiliser qui ne peuvent pas être facilement fait dans un constructeur.Imaginez qu'un objet a 20 propriétés que doit être fixé.Si vous définissez avec les paramètres du constructeur, que le constructeur serait horriblement laid -- imaginez un constructeur avec 20 paramètres!Au lieu de cela, vous pourriez construire un objet avec peut-être pas de paramètres, définissez le 20 valeurs à l'aide de mutateur méthodes, puis clone() l'objet pour le rendre prêt-à-copies en cas de besoin. clone() besoins pas de paramètres à tous, donc c'est évidemment moins laid.Si vous avez besoin de plusieurs copies de plusieurs versions différentes de cet objet, alors le prototype du modèle devient attrayant.

Prototype de modèle de conception est utilisé lors de la création d'objets à prendre trop de ressources systèmes et des performances, et nous utilisons ce modèle de conception exactement quand on veut avoir plusieurs instances d'une classe, et ces cas sont similaires, de sorte que nous ne voulons pas vraiment à utiliser, par exemple, l'opérateur “new” parce que ça va être si coûteux, tout ce que nous avons besoin est d'instancier les objets en se basant sur le premier déjà créé.

l'avantage est que le nouvel objet sera indépendant et il ne prendra pas trop de ressources pour être créé que le premier.voici un exemple de l'utilisation de ce concept en java:

  import java.util.Vector;

 public class Samsung implements Cloneable{
    private Vector<String> models; 

    public Samsung(){
        models=new Vector<>(); 
        //we suppose in this comments we access to a data Base to get models
        //and then we get a full list of Samsung models
        //... and finish
        //Sadly we took to much of time to fetch the database 
        //we don't want to waste our time again because Samsung rarely update its database
        models.add("Samsung S1"); 
        models.add("Samsung S2"); 
        models.add("galaxy note"); 
        models.add("galaxy star");
    }
    public Samsung(Vector<String> models){
        this.models=models;
    }

   public Samsung clone()  {

      Vector<String> modelsCopy=new Vector<>();
      Samsung samsungCopy=null;
    //here we don't need to access the database again, we will just copy the previous list
      try{
          for(String model:this.models){
              modelsCopy.add(model);
          }
          samsungCopy=new Samsung(modelsCopy); 
          return samsungCopy;
      }
      catch(Exception e){
          return null;
      }
}

}

le programme principal :

  public static void main(String[] args) {
        Samsung usa_Samsung=new Samsung();
        Samsung morocco_Samsung=usa_Samsung.clone(); 
        System.out.println("original = " + usa_Samsung);
        System.out.println("copy = " + morocco_Samsung);
    }

sortie :

original = Samsung@6d06d69c

copy = Samsung@7852e922

comme vous le voyez ces objets n'ont pas la même adresse parce qu'ils sont différents .

Remarque !j'ai utilisé le nom de “Samsung” ce n'est qu'un exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top