디자인 패턴 - Prototype Pattern

Table of Contents

출처 : https://www.tutorialspoint.com/design_pattern/prototype_pattern.htm

Prototype pattern은 성능을 염두에 두고 복제 객체를 생성하는 것을 말합니다. 이 패턴은 객체를 생성하는 가장 좋은 방법 중 하나를 제공하기 때문에 이러한 유형의 디자인 패턴은 생성 패턴에 속합니다.

이 패턴은 현재 객체의 복제본을 생성하도록 지시하는 프로토타입 인터페이스를 구현하는 것을 포함합니다. 이 패턴은 객체를 직접 생성하는 데 비용이 많이 들 때 사용됩니다. 예를 들어, 비용이 많이 드는 데이터베이스 작업 후에 개체가 생성됩니다. 객체를 캐시하고 다음 요청 시 복제본을 반환하고 필요할 때 데이터베이스를 업데이트하여 데이터베이스 호출을 줄일 수 있습니다.

Implementation

추상 클래스 ShapeShape 클래스를 확장하는 구체적인 클래스를 만들 것입니다. ShapeCache 클래스는 Hashtable에 모양 개체를 저장하고 요청 시 해당 복제본을 반환하는 다음 단계로 정의됩니다.

PrototypPatternDemo, our demo class will use ShapeCache class to get a Shape object.

Prototype Pattern UML Diagram

Step 1

Clonable 인터페이스를 구현하는 추상 클래스를 만듭니다.

Shape.java

 1public abstract class Shape implements Cloneable {
 2
 3   private String id;
 4   protected String type;
 5
 6   abstract void draw();
 7
 8   public String getType(){
 9      return type;
10   }
11
12   public String getId() {
13      return id;
14   }
15
16   public void setId(String id) {
17      this.id = id;
18   }
19
20   public Object clone() {
21      Object clone = null;
22
23      try {
24         clone = super.clone();
25
26      } catch (CloneNotSupportedException e) {
27         e.printStackTrace();
28      }
29
30      return clone;
31   }
32}

Step 2

위의 클래스를 확장하여 구체적인 클래스를 만듭니다.

Rectangle.java

 1public class Rectangle extends Shape {
 2
 3   public Rectangle(){
 4     type = "Rectangle";
 5   }
 6
 7   @Override
 8   public void draw() {
 9      System.out.println("Inside Rectangle::draw() method.");
10   }
11}

Square.java

 1public class Square extends Shape {
 2
 3   public Square(){
 4     type = "Square";
 5   }
 6
 7   @Override
 8   public void draw() {
 9      System.out.println("Inside Square::draw() method.");
10   }
11}

Circle.java

 1public class Circle extends Shape {
 2
 3   public Circle(){
 4     type = "Circle";
 5   }
 6
 7   @Override
 8   public void draw() {
 9      System.out.println("Inside Circle::draw() method.");
10   }
11}

Step 3

데이터베이스에서 구체적인 클래스를 가져오는 클래스를 만들고 Hashtable에 저장합니다.

ShapeCache.java

 1import java.util.Hashtable;
 2
 3public class ShapeCache {
 4
 5   private static Hashtable<String, Shape> shapeMap  = new Hashtable<String, Shape>();
 6
 7   public static Shape getShape(String shapeId) {
 8      Shape cachedShape = shapeMap.get(shapeId);
 9      return (Shape) cachedShape.clone();
10   }
11
12   // for each shape run database query and create shape
13   // shapeMap.put(shapeKey, shape);
14   // for example, we are adding three shapes
15
16   public static void loadCache() {
17      Circle circle = new Circle();
18      circle.setId("1");
19      shapeMap.put(circle.getId(),circle);
20
21      Square square = new Square();
22      square.setId("2");
23      shapeMap.put(square.getId(),square);
24
25      Rectangle rectangle = new Rectangle();
26      rectangle.setId("3");
27      shapeMap.put(rectangle.getId(), rectangle);
28   }
29}

Step 4

PrototypePatternDemoShapeCache 클래스를 사용하여 Hashtable에 저장된 모양의 복제본을 가져옵니다.

PrototypePatternDemo.java

 1public class PrototypePatternDemo {
 2   public static void main(String[] args) {
 3      ShapeCache.loadCache();
 4
 5      Shape clonedShape = (Shape) ShapeCache.getShape("1");
 6      System.out.println("Shape : " + clonedShape.getType());
 7
 8      Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
 9      System.out.println("Shape : " + clonedShape2.getType());
10
11      Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
12      System.out.println("Shape : " + clonedShape3.getType());
13   }
14}

Step 5

출력을 확인합니다.

1
2Shape : Circle
3Shape : Square
4Shape : Rectangle

이 시리즈의 게시물