Patrón de diseño de prototipo

Prototype nos permite ocultar la complejidad de hacer nuevas instancias del cliente. El concepto es copiar un objeto existente en lugar de crear una nueva instancia desde cero, algo que puede incluir operaciones costosas. El objeto existente actúa como un prototipo y contiene el estado del objeto. El objeto recién copiado puede cambiar las mismas propiedades solo si es necesario. Este enfoque ahorra recursos y tiempo costosos, especialmente cuando la creación de objetos es un proceso pesado.
El patrón prototipo es un patrón de diseño creacional. Se requieren patrones de prototipo, cuando la creación de objetos requiere mucho tiempo y una operación costosa, por lo que creamos objetos con el objeto existente en sí. Una de las mejores formas disponibles para crear un objeto a partir de objetos existentes es el método clon(). Clonar es el enfoque más simple para implementar un patrón de prototipo. Sin embargo, es su decisión decidir cómo copiar el objeto existente en función de su modelo de negocio.
 

Participantes en el diseño de prototipos

1) Prototipo : Este es el prototipo de un objeto real.
2) Registro de prototipos : se utiliza como un servicio de registro para tener acceso a todos los prototipos mediante parámetros de string simples.
3) Cliente : el Cliente será responsable de utilizar el servicio de registro para acceder a las instancias prototipo.
 

Cuándo usar el patrón de diseño de prototipo

Cuándo un sistema debe ser independiente de cómo se crean, componen y representan sus productos y 
Cuándo se especifican las clases para instanciar en tiempo de ejecución. 
Por ejemplo, 
1) Mediante carga dinámica o Para evitar construir una jerarquía de clases de fábricas que sea paralela a la jerarquía de clases de productos o
2) Cuando las instancias de una clase pueden tener una de unas pocas combinaciones diferentes de estado. Puede ser más conveniente instalar una cantidad correspondiente de prototipos y clonarlos en lugar de instanciar la clase manualmente, cada vez con el estado apropiado.
 

El diagrama UML del patrón de diseño de prototipo

Java

// A Java program to demonstrate working of
// Prototype Design Pattern with example
// of a ColorStore class to store existing objects.
 
import java.util.HashMap;
import java.util.Map;
 
 
abstract class Color implements Cloneable
{
     
    protected String colorName;
      
    abstract void addColor();
      
    public Object clone()
    {
        Object clone = null;
        try
        {
            clone = super.clone();
        }
        catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
        return clone;
    }
}
 
class blueColor extends Color
{
    public blueColor()
    {
        this.colorName = "blue";
    }
  
    @Override
    void addColor()
    {
        System.out.println("Blue color added");
    }
     
}
 
class blackColor extends Color{
  
    public blackColor()
    {
        this.colorName = "black";
    }
  
    @Override
    void addColor()
    {
        System.out.println("Black color added");
    }
}
  
class ColorStore {
  
    private static Map<String, Color> colorMap = new HashMap<String, Color>();
      
    static
    {
        colorMap.put("blue", new blueColor());
        colorMap.put("black", new blackColor());
    }
      
    public static Color getColor(String colorName)
    {
        return (Color) colorMap.get(colorName).clone();
    }
}
 
 
// Driver class
class Prototype
{
    public static void main (String[] args)
    {
        ColorStore.getColor("blue").addColor();
        ColorStore.getColor("black").addColor();
        ColorStore.getColor("black").addColor();
        ColorStore.getColor("blue").addColor();
    }
}

Producción: 

Blue color added
Black color added
Black color added
Blue color added

Diagrama UML de ejemplo: 
 

Ventajas del patrón de diseño de prototipo
 

  • Agregar y eliminar productos en tiempo de ejecución: los prototipos le permiten incorporar una nueva clase de producto concreto en un sistema simplemente registrando una instancia prototípica con el cliente. Eso es un poco más flexible que otros patrones de creación, porque un cliente puede instalar y eliminar prototipos en tiempo de ejecución.
     
  • Especificación de nuevos objetos mediante la variación de valores: los sistemas altamente dinámicos le permiten definir un nuevo comportamiento a través de la composición de objetos especificando valores para las variables de un objeto y no definiendo nuevas clases. 
     
  • Especificación de nuevos objetos por estructura variable: muchas aplicaciones crean objetos a partir de partes y subpartes. Por conveniencia, tales aplicaciones a menudo le permiten instanciar estructuras complejas definidas por el usuario para usar un subcircuito específico una y otra vez. 
     
  • Subclases reducidas: Factory Method a menudo produce una jerarquía de clases Creator que es paralela a la jerarquía de clases de productos. El patrón de prototipo le permite clonar un prototipo en lugar de pedirle a un método de fábrica que cree un nuevo objeto. Por lo tanto, no necesita una jerarquía de clases de creador en absoluto. 
     

Desventajas del patrón de diseño de prototipo 

  • Exagerado para un proyecto que usa muy pocos objetos y/o no tiene un énfasis subyacente en la extensión de strings de prototipos. 
     
  • También oculta clases de productos concretos del cliente.
  • Cada subclase de Prototype debe implementar la operación clone() que puede ser difícil, cuando las clases bajo consideración ya existen. Además, implementar clone() puede ser difícil cuando sus partes internas incluyen objetos que no admiten la copia o tienen referencias circulares.

Lectura adicional: Método prototipo en Python
Este artículo es una contribución de Saket Kumar . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *