Frage

Ich habe das Prototyp-Entwurfsmuster durchgesehen und hatte einige Fragen.

Ich habe verstanden, dass das Prototyp-Entwurfsmuster für die Erstellung von Objekten verwendet wird, die in Bezug auf Speicher oder Ressourcen kostspielig sind.In diesem Fall verwenden wir einen Klon des bereits vorhandenen Objekts.

Was ist also der Unterschied zwischen der Erstellung eines new Objekt und clone()?Wo wird das Objekt im Speicher gespeichert?

War es hilfreich?

Lösung

Prototyp-Entwurfsmuster bieten Kosteneinsparungen in zweierlei Hinsicht: Zeiteinsparungen und Platzeinsparungen.

Zeiteinsparungen ergeben sich in Situationen, in denen die Erstellung eines Objekts einen kostspieligen Zugriff auf Zusatzinformationen erfordert – beispielsweise das Anfordern von Konfigurationsdaten aus einer Datei, einer Datenbank oder über ein Netzwerk.Wenn Sie beispielsweise viele Seiten aus einer Vorlage erstellen, die auf einem Webserver gespeichert ist, ist es günstiger, die Vorlage einmal zu lesen und zu klonen, um den Ausgangspunkt für jede neue Seite zu erhalten, als den Webserver separat abzufragen jede Seite.

Speichereinsparungen ergeben sich aus der Wiederverwendung unveränderlicher Objekte:Wenn Ihr Original viele Strings enthält, müsste beim Erstellen einer neuen Instanz entweder völlig neue unveränderliche Strings erstellt oder die String-Internierung manuell durchgeführt werden.Die Verwendung des Prototypmusters vermeidet dieses Problem elegant, indem der Klon die unveränderlichen Teile der Vorlage gemeinsam nutzt.

Andere Tipps

Das Java clone() Die Methode erstellt einfach ein neues Objekt und kopiert die Werte der Mitgliedsvariablen hinein.Im Allgemeinen ist es weder teurer noch kostengünstiger als die Erstellung eines neuen Objekts.Das einzige Mal clone() könnte billiger sein, als ein Objekt mit zu erstellen new wäre, wenn der Konstruktor für ein Objekt etwas Kostspieliges tut:Was wäre beispielsweise, wenn der Konstruktor die Argumente als Teil einer Datenbankabfrage verwenden würde?In diesem Fall verwenden clone() wäre billiger, da der teure Abfragevorgang entfallen würde.

Es gibt jedoch noch andere Gründe, dieses Entwurfsmuster zu verwenden:Meistens, wenn Objekte vor der Verwendung eine komplizierte Einrichtung erfordern, die in einem Konstruktor nicht bequem durchgeführt werden kann.Stellen Sie sich vor, ein Objekt hätte 20 Eigenschaften, die festgelegt werden müssten.Wenn Sie sie mit Konstruktorparametern festlegen, wäre dieser Konstruktor schrecklich hässlich – stellen Sie sich einen Konstruktor mit 20 Parametern vor!Stattdessen könnten Sie ein Objekt ohne Parameter erstellen und dann die 20 Werte mithilfe von Mutatormethoden festlegen clone() das Objekt, bei Bedarf fertige Kopien anzufertigen. clone() benötigt überhaupt keine Parameter, daher ist es offensichtlich weniger hässlich.Wenn Sie mehrere Kopien verschiedener Versionen dieses Objekts benötigen, wird das Prototypmuster attraktiv.

Das Prototyp-Entwurfsmuster wird verwendet, wenn die Erstellung von Objekten zu viele Systemressourcen und -leistungen in Anspruch nimmt. Wir verwenden dieses Entwurfsmuster genau dann, wenn wir viele Instanzen einer Klasse haben möchten und diese Instanzen ähnlich sind, sodass wir dies nicht wirklich möchten Um zum Beispiel den Operator „new“ zu verwenden, weil er so kostspielig ist, müssen wir diese Objekte lediglich auf der Grundlage des ersten bereits erstellten Objekts instanziieren.

Der Vorteil besteht darin, dass das neue Objekt unabhängig ist und nicht zu viele Ressourcen benötigt, um als erstes erstellt zu werden.Hier ein Beispiel für die Verwendung dieses Konzepts in 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;
      }
}

}

das Hauptprogramm:

  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);
    }

Ausgabe :

original = Samsung@6d06d69c

copy = Samsung@7852e922

Wie Sie sehen, haben diese Objekte nicht die gleiche Adresse, weil sie unterschiedlich sind.

Notiz !Ich habe den Namen „Samsung“ nur als Beispiel verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top