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