Entwurfsmuster - Prototypmuster

Das Prototypmuster bezieht sich auf das Erstellen eines doppelten Objekts unter Berücksichtigung der Leistung. Diese Art von Entwurfsmuster fällt unter das Erstellungsmuster, da dieses Muster eine der besten Möglichkeiten zum Erstellen eines Objekts bietet.

Dieses Muster beinhaltet die Implementierung einer Prototypschnittstelle, die anweist, einen Klon des aktuellen Objekts zu erstellen. Dieses Muster wird verwendet, wenn die direkte Erstellung eines Objekts kostspielig ist. Beispielsweise soll ein Objekt nach einer kostspieligen Datenbankoperation erstellt werden. Wir können das Objekt zwischenspeichern, seinen Klon bei der nächsten Anforderung zurückgeben und die Datenbank bei Bedarf aktualisieren, wodurch Datenbankaufrufe reduziert werden.

Implementierung

Wir werden eine abstrakte Klasse Shape und konkrete Klassen erstellen , die die Shape- Klasse erweitern. Eine Klasse ShapeCache wird als nächster Schritt definiert die Form speichert in einem Objekt Hashtable und gibt sie Klon , wenn angefordert.

PrototypPatternDemo , unsere Demo-Klasse, verwendet die ShapeCache- Klasse, um ein Shape- Objekt abzurufen .

Schritt 1

Erstellen Sie eine abstrakte Klasse, die die klonbare Schnittstelle implementiert .

Shape.java

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;
   }
}

Schritt 2

Erstellen Sie konkrete Klassen, die die obige Klasse erweitern.

Rectangle.java

public class Rectangle extends Shape {

   public Rectangle(){
     type = "Rectangle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

public class Square extends Shape {

   public Square(){
     type = "Square";
   }

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

Circle.java

public class Circle extends Shape {

   public Circle(){
     type = "Circle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

Schritt 3

Erstellen Sie eine Klasse, um konkrete Klassen aus der Datenbank abzurufen und in einer Hashtabelle zu speichern .

ShapeCache.java

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();
   }

   // for each shape run database query and create shape
   // shapeMap.put(shapeKey, shape);
   // for example, we are adding three shapes
   
   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);
   }
}

Schritt 4

PrototypePatternDemo verwendet die ShapeCache- Klasse, um Klone von Formen abzurufen , die in einer Hashtable gespeichert sind .

PrototypePatternDemo.java

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());		
   }
}

Schritt 5

Überprüfen Sie die Ausgabe.

Shape : Circle
Shape : Square
Shape : Rectangle