Wzorce projektowe - wzorzec prototypowy

Wzorzec prototypowy odnosi się do tworzenia zduplikowanych obiektów z uwzględnieniem wydajności. Ten typ wzorca projektowego wchodzi w zakres wzorca kreacyjnego, ponieważ ten wzorzec zapewnia jeden z najlepszych sposobów tworzenia obiektu.

Ten wzorzec obejmuje implementację prototypowego interfejsu, który mówi, aby utworzyć klon bieżącego obiektu. Ten wzorzec jest używany, gdy bezpośrednie tworzenie obiektu jest kosztowne. Na przykład obiekt ma zostać utworzony po kosztownej operacji na bazie danych. Możemy buforować obiekt, zwracać jego klon na następne żądanie i aktualizować bazę danych w razie potrzeby, zmniejszając w ten sposób liczbę wywołań bazy danych.

Realizacja

Stworzymy abstrakcyjną klasę Shape i konkretne klasy rozszerzające klasę Shape . Klasa ShapeCache jest zdefiniowany jako następny krok, który sprzeciwia kształt sklepów w Hashtable i zwraca ich klona żądanie.

PrototypPatternDemo , nasza klasa demonstracyjna użyje klasy ShapeCache do pobrania obiektu Shape .

Krok 1

Utwórz klasę abstrakcyjną implementującą interfejs Clonable .

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

Krok 2

Utwórz konkretne klasy rozszerzające powyższą klasę.

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.");
   }
}

Krok 3

Utwórz klasę, aby pobrać konkretne klasy z bazy danych i przechowywać je w tablicy z haszowaniem .

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

Krok 4

PrototypePatternDemo wykorzystuje ShapeCache klasę uzyskać klony kształtach przechowywanych w Hashtable .

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

Krok 5

Sprawdź dane wyjściowe.

Shape : Circle
Shape : Square
Shape : Rectangle