Java Design Pattern - Prototype Pattern
업데이트:
Design Pattern
- 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다.
- 디자인 패턴은 알고리즘이 아니라 상황에 따라 자주 쓰이는 설계 방법을 정리한 코딩 방법론일 뿐이며 모든 상황의 해결책이 아니다.
Creational Patterns, 생성 패턴
- 객체가 생성되는 방식을 중시하는 패턴이다.
- 객체의 생성과 조합을 캡슐화하여 객체가 생성 혹은 수정되어도 전체 프로그램 구조에 영향을 받지 않도록 유연성을 제공한다.
Factory Method Pattern
- Original 객체를 새로운 객체에 복사하여 우리의 필요에 따라 수정하는 메커니즘을 제공하는 패턴이다.
- Java Cloneable 클래스의 clone() 메서드가 대표적인 예이다.
Example
public abstract class Shape implements Cloneable {
private int id;
protected String type;
abstract void draw();
public String getType() {
return type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
public class Circle extends Shape {
public Circle() {
type = "Circle";
}
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
public class Rectangle extends Shape {
public Rectangle() {
type = "Rectangle";
}
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square extends Shape {
public Square() {
type = "Square";
}
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public class Square extends Shape {
public Square() {
type = "Square";
}
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
- Clonable을 상속받은 Shape Abstarct 객체를 선언하고, 하위 형태의 객체를 생성한다.
public class ShapeCache {
private static Map<Integer, Shape> shapeMap = new ConcurrentHashMap<Integer, Shape>();
public static Shape getShape(int 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);
}
}
- ShapeCache 객체는 Persistence Layer 대용으로 사용 할 객체이다.
public class PrototypePatternMain {
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());
}
}
- ShapeCache 객체의 getShape 메서드를 이용하여 clone된 객체를 반환함으로써, Prototype Pattern을 구현한다.
Source
Sample Code는 여기에서 확인 가능합니다.
댓글남기기