Es uno de los patrones de diseño creacionales.
Se utiliza para crear copias duplicadas/superficiales del objeto determinado.
Este patrón es útil cuando la creación directa de objetos es costosa. Ejemplo: si se crea un objeto después de consultar una base de datos grande, crear el objeto una y otra vez no es económico en términos de rendimiento.
Por lo tanto, una vez que se crea el objeto, lo almacenamos en caché y, cuando necesitemos el mismo objeto en el futuro, lo obtenemos de la caché en lugar de crearlo nuevamente desde la base de datos, y actualizamos la base de datos cuando sea necesario para reducir las llamadas a la base de datos. .
Nota: Tendremos que usar Cloneable, es decir, una interfaz de marcador para el objeto que necesita ser clonado, (Clonable) no contiene ningún método, indica que una clase se puede clonar, lo que significa crear una copia de una objeto.
El método Object.clone() crea una copia superficial de forma predeterminada
De forma predeterminada, el método clone() realiza una copia superficial del objeto. Esto significa que crea un nuevo objeto y copia todos los campos del objeto original al nuevo objeto. Sin embargo, si el objeto contiene referencias a otros objetos (por ejemplo, matrices, listas u objetos personalizados), se copian las referencias en sí, no los objetos reales a los que apuntan.
Como resultado, tanto el objeto original como el clonado harán referencia a los mismos objetos para esos campos. Cualquier cambio realizado en los objetos referenciados a través de una instancia se reflejará en la otra.
Entendamos esto con un ejemplo de un objeto Forma que se puede clonar.
Forma
public class Shape implements Cloneable { private String id; protected String shape; @Override public String toString() { return "Shape [id=" id ", shape=" shape "]"; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getShape() { return shape; } @Override public Object clone(){ Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } }
Clases infantiles
public class Rectangle extends Shape { public Rectangle(){ shape = "Rectangle"; } public void draw(){ System.out.println("calling draw() of Rectangle shape"); } } public class Circle extends Shape { public Circle(){ shape = "Circle"; } public void draw(){ System.out.println("Calling draw in Circle method"); } }
Cache
public class ShapeCache { public static HashMapcache = new HashMap(); public static Shape cloneObject(String id){ return (Shape)cache.get(id); } public static void addShapeInCache(Shape shape){ cache.put(shape.getId(),shape); } }
Principal
public class Main { public static void main(String args[]){ Shape circle = new Circle(); circle.setId("1"); Shape rectangle = new Rectangle(); rectangle.setId("2"); ShapeCache.addShapeInCache(rectangle); ShapeCache.addShapeInCache(circle); Shape copyShape1 = (Shape) ShapeCache.cache.get(circle.getId()); Shape copyShape2 =(Shape) ShapeCache.cache.get(rectangle.getId()); System.out.println(copyShape1); System.out.println(copyShape2); } }
Producción:
Shape [id=1, shape=Circle] Shape [id=2, shape=Rectangle]
Puntos clave
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3