"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Prototipo

Prototipo

Publicado el 2024-11-08
Navegar:332

Prototype

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 HashMap cache = 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

  • Tanto el Círculo como el Rectángulo siguen el principio de sustitución de Liskov (principio SÓLIDO) que establece que El objeto debe ser reemplazable con sus subtipos sin afectar la corrección del código.
  • Solo se crea una copia superficial del objeto Forma.
Declaración de liberación Este artículo se reproduce en: https://dev.to/prashantrmishra/prototype-15hn?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

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