12. Patrón de diseño patrón de prototipo (patrón de prototipo) Tome una variedad de formas como ejemplo

El patrón de prototipo (Patrón de prototipo) se utiliza para crear objetos duplicados mientras se garantiza el rendimiento. Este tipo de patrón de diseño pertenece al patrón de creación, que proporciona la mejor manera de crear objetos.

Este modo implementa una interfaz prototipo que se utiliza para crear un clon del objeto actual. Este modo se usa cuando el costo de crear objetos directamente es relativamente alto. Por ejemplo, es necesario crear un objeto después de una costosa operación de base de datos. Podemos almacenar en caché el objeto, devolver su clon en la siguiente solicitud y actualizar la base de datos cuando sea necesario para reducir las llamadas a la base de datos.

Introducción

Intención : utilizar instancias de prototipos para especificar los tipos de objetos que se crearán y crear nuevos objetos copiando estos prototipos.

La solución principal : crear y eliminar prototipos durante el tiempo de ejecución.

Cuándo usarlo : 1. Cuándo debe crearse, estructurarse y representarse un sistema independientemente de sus productos. 2. Cuando la clase a instanciar se especifica en tiempo de ejecución, por ejemplo, mediante carga dinámica. 3. Evitar la creación de un nivel de clase de fábrica paralelo al nivel de clase de producto. 4. Cuando una instancia de una clase solo puede tener una de varias combinaciones de estados diferentes. Puede ser más conveniente crear un número correspondiente de prototipos y clonarlos que instanciar manualmente la clase con el estado apropiado cada vez.

Cómo resolverlo : utilice un objeto prototipo existente para generar rápidamente la misma instancia que el objeto prototipo.

Código clave : 1. Realice la operación de clonación, herede Cloneable en JAVA y reescriba clone (). En .NET, puede usar el método MemberwiseClone () de la clase Object para realizar copias superficiales de objetos o realizar copias profundas mediante serialización. 2. El patrón prototipo también se utiliza para aislar la relación de acoplamiento entre el usuario del objeto de clase y el tipo específico (clase volátil) También requiere que estas "clases volátiles" tengan una interfaz estable.

Ejemplos de aplicación : 1. División celular. 2. El método Object clone () en JAVA.

Ventajas : 1. Rendimiento mejorado. 2. Escape de las limitaciones del constructor.

Desventajas : 1. Equipar con un método de clonación requiere una consideración exhaustiva de las funciones de la clase. Esto no es difícil para las clases nuevas, pero no necesariamente fácil para las clases existentes, especialmente cuando una referencia de clase no admite objetos indirectos serializados. O cuando la referencia contiene una estructura cíclica. 2. Debe implementarse la interfaz Cloneable.

Escenarios de uso : 1. Escenarios de optimización de recursos. 2. La inicialización de clases necesita asimilar una gran cantidad de recursos, incluidos los recursos de datos y hardware. 3. Escenarios con requisitos de desempeño y seguridad. 4. Generar un objeto a través de nuevo requiere una preparación de datos muy tediosa o derechos de acceso, por lo que puede utilizar el modo de prototipo. 5. Una escena con múltiples modificadores para un objeto. 6. Cuando es necesario proporcionar un objeto a otros objetos para su acceso, y cada llamador puede necesitar modificar su valor, considere usar el modo de prototipo para copiar varios objetos para que los utilice el llamador. 7. En proyectos reales, el modo de prototipo rara vez aparece solo. Por lo general, aparece junto con el modo de método de fábrica. Se crea un objeto mediante el método de clonación y, a continuación, se proporciona el método de fábrica al llamador. El modo prototipo se ha integrado con Java y todos pueden usarlo a su antojo.

Nota: A diferencia de la construcción de nuevos objetos creando una instancia de una clase, el modo de prototipo genera nuevos objetos copiando un objeto existente. Implementaciones de copia superficial Cloneable, reescritura y copia profunda implementa Serializable para leer flujos binarios.

lograr

Crearemos una clase abstracta Shape y una clase de entidad que amplíe la clase Shape. El siguiente paso es definir la clase ShapeCache, que almacena los objetos de forma en una tabla hash y devuelve sus clones cuando se solicitan.

PrototypePatternDemo, nuestra clase de demostración usa la clase ShapeCache para obtener el objeto Shape.
Inserte la descripción de la imagen aquí

paso 1

Cree una clase abstracta que implemente la interfaz Cloneable.

public abstract class Shape implements Cloneable {
   
   private String id;
   protected String type;
   
   abstract void draw();
   
   public String getType(){
      return type;
   }
   
   public String getId() {
      return id;
   }
   
   public void setId(String id) {
      this.id = id;
   }
   
   public Object clone() {
      Object clone = null;
      try {
         clone = super.clone();
      } catch (CloneNotSupportedException e) {
         e.printStackTrace();
      }
      return clone;
   }
}

Paso 2

Cree una clase de entidad que amplíe la clase abstracta anterior.

public class Rectangle extends Shape {
 
   public Rectangle(){
     type = "Rectangle";
   }
 
   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}
public class Square extends Shape {
 
   public Square(){
     type = "Square";
   }
 
   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}
public class Circle extends Shape {
 
   public Circle(){
     type = "Circle";
   }
 
   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

Paso 3

Cree una clase, obtenga las clases de entidad de la base de datos y almacénelas en un Hashtable.

import java.util.Hashtable;
 
public class ShapeCache {
    
   private static Hashtable<String, Shape> shapeMap 
      = new Hashtable<String, Shape>();
 
   public static Shape getShape(String shapeId) {
      Shape cachedShape = shapeMap.get(shapeId);
      return (Shape) cachedShape.clone();
   }
 
   // 对每种形状都运行数据库查询,并创建该形状
   // shapeMap.put(shapeKey, shape);
   // 例如,我们要添加三种形状
   public static void loadCache() {
      Circle circle = new Circle();
      circle.setId("1");
      shapeMap.put(circle.getId(),circle);
 
      Square square = new Square();
      square.setId("2");
      shapeMap.put(square.getId(),square);
 
      Rectangle rectangle = new Rectangle();
      rectangle.setId("3");
      shapeMap.put(rectangle.getId(),rectangle);
   }
}

Paso 4

PrototypePatternDemo usa la clase ShapeCache para obtener un clon de la forma almacenada en Hashtable.

public class PrototypePatternDemo {
   public static void main(String[] args) {
      ShapeCache.loadCache();
 
      Shape clonedShape = (Shape) ShapeCache.getShape("1");
      System.out.println("Shape : " + clonedShape.getType());        
 
      Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
      System.out.println("Shape : " + clonedShape2.getType());        
 
      Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
      System.out.println("Shape : " + clonedShape3.getType());        
   }
}

Paso 5

Ejecute el programa y muestre el resultado:

Shape : Circle
Shape : Square
Shape : Rectangle

El resto de los patrones de diseño se aprenderán en el tutorial para principiantes.
Haga clic en https://www.runoob.com/design-pattern/flyweight-pattern.html

  1. El patrón de diseño Flyweight Pattern toma una variedad de formas al azar como ejemplo

  2. Patrón de diseño Patrón de proxy Tome la imagen del disco como ejemplo

  3. Patrón de diseño Patrón de puente Tome círculos de dibujo de diferentes colores como ejemplo

  4. Patrón de diseño Patrón compuesto (patrón compuesto) Tome la creación e impresión de la jerarquía de empleados como ejemplo

  5. Patrón de diseño Patrón de iterador (Patrón de iterador) Tome el uso de iteradores para imprimir nombres como ejemplo

  6. Patrón de diseño Patrón de mediador (Patrón de mediador) Tome las salas de chat públicas como ejemplo

  7. Patrón de diseño Patrón de recuerdo (Patrón de recuerdo) Tome la nota como ejemplo

  8. Patrón de diseño Patrón de intérprete (Patrón de intérprete) Tome la explicación de una oración como ejemplo

  9. Patrón de diseño Patrón de cadena de responsabilidad (Patrón de cadena de responsabilidad) Tome como ejemplo los registros de impresión en Android Studio

  10. Patrón de diseño Patrón de visitante (Patrón de visitante) para mostrar los componentes de la computadora como ejemplo

Supongo que te gusta

Origin blog.csdn.net/GTC_GZ/article/details/108754788
Recomendado
Clasificación