디자인 패턴 - Prototype Pattern
Table of Contents
출처 : https://www.tutorialspoint.com/design_pattern/prototype_pattern.htm
Prototype pattern은 성능을 염두에 두고 복제 객체를 생성하는 것을 말합니다. 이 패턴은 객체를 생성하는 가장 좋은 방법 중 하나를 제공하기 때문에 이러한 유형의 디자인 패턴은 생성 패턴에 속합니다.
이 패턴은 현재 객체의 복제본을 생성하도록 지시하는 프로토타입 인터페이스를 구현하는 것을 포함합니다. 이 패턴은 객체를 직접 생성하는 데 비용이 많이 들 때 사용됩니다. 예를 들어, 비용이 많이 드는 데이터베이스 작업 후에 개체가 생성됩니다. 객체를 캐시하고 다음 요청 시 복제본을 반환하고 필요할 때 데이터베이스를 업데이트하여 데이터베이스 호출을 줄일 수 있습니다.
Implementation
추상 클래스 Shape와 Shape 클래스를 확장하는 구체적인 클래스를 만들 것입니다. ShapeCache 클래스는 Hashtable에 모양 개체를 저장하고 요청 시 해당 복제본을 반환하는 다음 단계로 정의됩니다.
PrototypPatternDemo, our demo class will use ShapeCache class to get a Shape object.
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
PrototypePatternDemo는 ShapeCache 클래스를 사용하여 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
이 시리즈의 게시물
- Tutorial 디자인 패턴 of Java
- Tutorial 디자인 패턴 of Java
- 디자인 패턴 - Overview
- 디자인 패턴 - Overview
- 디자인 패턴 - Factory Pattern
- 디자인 패턴 - Factory Pattern
- 디자인 패턴 - Abstract Factory Pattern
- 디자인 패턴 - Abstract Factory Pattern
- 디자인 패턴 - Singleton Pattern
- 디자인 패턴 - Singleton Pattern
- 디자인 패턴 - Builder Pattern
- 디자인 패턴 - Builder Pattern
- 디자인 패턴 - Prototype Pattern
- 디자인 패턴 - Prototype Pattern
- 디자인 패턴 - Bridge Pattern
- 디자인 패턴 - Bridge Pattern
- 디자인 패턴 - Filter Pattern
- 디자인 패턴 - Filter Pattern
- 디자인 패턴 - Composite Pattern
- 디자인 패턴 - Composite Pattern
- 디자인 패턴 - Proxy Pattern
- 디자인 패턴 - Proxy Pattern
- 디자인 패턴 - Mediator Pattern
- 디자인 패턴 - Mediator Pattern
- 디자인 패턴 - Useful Resources
- 디자인 패턴 - Useful Resources