Pregunta

Yo estaba pasando por el diseño de Prototipo de patrón y tenía algunas preguntas.

Tengo entendido que el Prototipo de patrón de diseño es utilizado para la creación de objetos que son costosos en términos de memoria o recursos.En que caso se utiliza un clon del objeto que ya está disponible.

Entonces, ¿cuál es la diferencia entre la creación de un new objeto y clone()?Dónde está el objeto almacenado en la memoria?

¿Fue útil?

Solución

Prototipo de patrón de diseño ofrece ahorros en los costos de dos tipos - ahorro de tiempo y ahorro de espacio.

Ahorro de tiempo de venir en situaciones cuando la creación de un objeto requiere de un costoso el acceso a la información auxiliar - decir, solicitando los datos de configuración de un archivo, una base de datos, o a través de una red.Por ejemplo, si usted está construyendo una gran cantidad de páginas a partir de una plantilla que se almacena en un servidor web, que es más barato para leer la plantilla una vez y clonarlo para obtener el punto de partida para cada nueva página, en lugar de consultar el servidor web por separado para cada página.

Ahorro de memoria provienen de la reutilización de objetos inmutables:si el original contiene un montón de cadenas, la creación de una nueva instancia tendría que crear uno totalmente nuevo inmutable cadenas, o de acuerdo con la cadena de la internación de forma manual.Utilizando el patrón prototipo correctamente, evita este problema al permitir que el clon de compartir la inmutable partes de la plantilla.

Otros consejos

El Java clone() método crea un nuevo objeto y copias miembro de los valores de la variable en él.En general, no es ni más ni menos costoso que la creación de un nuevo objeto.La única vez que clone() podría ser más barato que la creación de un objeto con new sería cuando el constructor de un objeto es algo caro:por ejemplo, ¿qué pasa si el constructor tomó los argumentos y los utiliza como parte de una consulta de base de datos?En ese caso, el uso de clone() sería más barato, como la costosa operación de consulta no iba a pasar.

Hay otras razones para el uso de este patrón de diseño, sin embargo:sobre todo, cuando los objetos necesidad complicado de la instalación antes de utilizar que no puede estar muy bien hecho en un constructor.Imaginar que un objeto tenía 20 propiedades que necesita ser ajustado.Si los define con los parámetros del constructor, constructor que sería horriblemente feo, imaginad que un constructor con más de 20 parámetros!En su lugar, usted podría construir un objeto con tal vez sin parámetros, establezca el 20 de valores usando métodos mutadores, entonces clone() el objeto de hacer ready-made copias cuando sea necesario. clone() no necesita parámetros del todo, así que obviamente es menos feo.Si necesitan múltiples copias de varias versiones diferentes de este objeto, entonces el patrón prototipo se convierte en atractivo.

Prototipo de patrón de diseño se utiliza cuando la creación de objetos de tomar demasiado de sistema de recursos y actuaciones, y hacemos uso de este patrón de diseño exactamente cuando queremos tener muchas instancias de una clase, y los casos son similares, así que en realidad no quieren, por ejemplo, utilizar el operador "new" porque va a ser tan costosos, todo lo que necesitamos es instanciar los objetos basándose en la primera uno ya creado.

la ventaja es que el nuevo objeto será independiente y no se ocupan demasiado de los recursos que se creó como la primera.aquí un ejemplo del uso de este concepto 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;
      }
}

}

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

salida :

original = Samsung@6d06d69c

copy = Samsung@7852e922

como se puede ver estos objetos no tienen la misma dirección porque son diferentes .

Nota !he utilizado el nombre de "Samsung" sólo como un ejemplo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top