Tasarım Desenleri - Prototip Desen
Prototip deseni, performansı göz önünde bulundurarak yinelenen nesne oluşturmayı ifade eder. Bu desen türü, bir nesneyi yaratmanın en iyi yollarından birini sağladığından, bu tür bir tasarım deseni yaratımsal modelin kapsamına girer.
Bu model, mevcut nesnenin bir klonunu oluşturmayı söyleyen bir prototip arayüzünün uygulanmasını içerir. Bu desen, doğrudan nesnenin oluşturulması maliyetli olduğunda kullanılır. Örneğin, maliyetli bir veritabanı işleminden sonra bir nesne oluşturulacaktır. Nesneyi önbelleğe alabilir, bir sonraki talepte klonunu döndürür ve gerektiğinde veritabanını güncelleyerek veritabanı çağrılarını azaltırız.
Uygulama
Shape sınıfını genişleten soyut bir Shape sınıfı ve somut sınıflar oluşturacağız . ShapeCache sınıfı , şekil nesnelerini Hashtable'da depolayan ve istendiğinde klonlarını döndüren bir sonraki adım olarak tanımlanır .
PrototypPatternDemo , demo sınıfımız bir Shape nesnesi almak için ShapeCache sınıfını kullanacaktır .
Aşama 1
Klonlanabilir arabirimi uygulayan soyut bir sınıf oluşturun .
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;
}
}
Adım 2
Yukarıdaki sınıfı genişleten somut sınıflar oluşturun.
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.");
}
}
Aşama 3
Veritabanından somut sınıflar almak ve bunları bir Hashtable'da depolamak için bir sınıf oluşturun .
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);
}
}
4. adım
PrototypePatternDemo , Hashtable'da depolanan şekillerin klonlarını almak için ShapeCache sınıfını kullanır .
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());
}
}
Adım 5
Çıkışı doğrulayın.
Shape : Circle
Shape : Square
Shape : Rectangle