Pola Desain - Pola Prototipe

Pola prototipe mengacu pada pembuatan objek duplikat dengan tetap memperhatikan performa. Jenis pola desain ini berada di bawah pola kreasi karena pola ini menyediakan salah satu cara terbaik untuk membuat suatu objek.

Pola ini melibatkan penerapan antarmuka prototipe yang memberi tahu untuk membuat tiruan dari objek saat ini. Pola ini digunakan saat pembuatan objek secara langsung memakan biaya. Misalnya, sebuah objek akan dibuat setelah operasi database yang mahal. Kita bisa menyimpan objek ke cache, mengembalikan klonnya pada permintaan berikutnya dan memperbarui database jika diperlukan sehingga mengurangi panggilan database.

Penerapan

Kita akan membuat kelas bentuk abstrak dan kelas beton memperluas kelas bentuk . Kelas ShapeCache didefinisikan sebagai langkah berikutnya yang menyimpan objek bentuk dalam Hashtable dan mengembalikan klonnya saat diminta.

PrototypPatternDemo , kelas demo kami akan menggunakan kelas ShapeCache untuk mendapatkan objek Shape .

Langkah 1

Buat kelas abstrak yang mengimplementasikan antarmuka 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;
   }
}

Langkah 2

Buat kelas beton yang memperluas kelas di atas.

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

LANGKAH 3

Buat kelas untuk mendapatkan kelas konkret dari database dan menyimpannya dalam Hashtable .

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

LANGKAH 4

PrototypePatternDemo menggunakan kelas ShapeCache untuk mendapatkan klon dari bentuk yang disimpan dalam 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());		
   }
}

LANGKAH 5

Verifikasi hasilnya.

Shape : Circle
Shape : Square
Shape : Rectangle