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