Mẫu thiết kế - Mẫu nguyên mẫu

Mẫu nguyên mẫu đề cập đến việc tạo đối tượng trùng lặp trong khi vẫn lưu ý đến hiệu suất. Loại mẫu thiết kế này thuộc mẫu sáng tạo vì mẫu này cung cấp một trong những cách tốt nhất để tạo một đối tượng.

Mẫu này liên quan đến việc triển khai một giao diện nguyên mẫu yêu cầu tạo một bản sao của đối tượng hiện tại. Mẫu này được sử dụng khi việc tạo đối tượng trực tiếp là tốn kém. Ví dụ, một đối tượng sẽ được tạo sau một hoạt động cơ sở dữ liệu tốn kém. Chúng ta có thể lưu vào bộ nhớ cache của đối tượng, trả về bản sao của nó theo yêu cầu tiếp theo và cập nhật cơ sở dữ liệu khi cần thiết, do đó giảm bớt các lệnh gọi cơ sở dữ liệu.

Thực hiện

Chúng ta sẽ tạo một lớp trừu tượng Shape và các lớp cụ thể mở rộng lớp Shape . Một lớp ShapeCache được định nghĩa là bước tiếp theo lưu trữ các đối tượng hình dạng trong Hashtable và trả về bản sao của chúng khi được yêu cầu.

PrototypPatternDemo , lớp demo của chúng ta sẽ sử dụng lớp ShapeCache để lấy một đối tượng Shape .

Bước 1

Tạo một lớp trừu tượng triển khai giao diện 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;
   }
}

Bước 2

Tạo các lớp cụ thể mở rộng lớp trên.

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

Bước 3

Tạo một lớp để lấy các lớp cụ thể từ cơ sở dữ liệu và lưu trữ chúng trong 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);
   }
}

Bước 4

PrototypePatternDemo sử dụng lớp ShapeCache để lấy bản sao của các hình dạng được lưu trữ trong 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());		
   }
}

Bước 5

Xác minh kết quả đầu ra.

Shape : Circle
Shape : Square
Shape : Rectangle