프로토타입 패턴은 한번 생성 된 객체가 자주 바뀌지 않고 공유되며 사용 될 때 주로 쓰인다.
Cloneable 인터페이스를 상속 받은 추상 클래스를 1개 만들고 해당 추상클래스를 상속받는 클래스를 만든다.
그리고 상속받은 클래스를 관리하는 클래스를 1개 더 만들어 사용한다.
즉, A라는 Cloneable 인터페이스를 상속받은 클래스를 B, C 클래스가 구현하고 그러한 B,C를 D라는 클래스가 객체를 관리해서 사용하는 패턴이다.
//상속받아 사용 할 클래스(A)
abstract class Type implements Cloneable {
public String text; //문자
public int number; //숫자
abstract void printer();
@Override
public Object clone() throws CloneNotSupportedException {
Object clone = super.clone(); //만약 ARRAY 같은 객체가 있는 경우에는 해당 ARRAY 객체도 Clone을 활용해서 return해야 된다.
return clone;
}
}
class Type1 extends Type {//상속받아 사용하는 클래스B
public Type1(){
this.text = "type1";
}
@Override
void printer() {
System.out.println("Im type 1");
}
}
class Type2 extends Type {//상속받아 사용하는 클래스C
public Type2(){
this.text = "type2";
}
@Override
void printer() {
System.out.println("Im type 2");
}
}
class TypeBody{ //B와C를 관리하는 클래스D
private static final Hashtable<Integer, Type> map = new Hashtable<Integer, Type>();
public static Type getType(int number) throws CloneNotSupportedException{
return (Type) map.get(number).clone(); //줄때 clone된 객체를 리턴
}
public final static void loadType(){
Type1 type = new Type1();
type.number = 1;
map.put(1, type);
Type2 type2 = new Type2();
type2.number = 1;
map.put(2, type2);
}
}
import java.util.Hashtable;
public class PrototypeExample {
static{
TypeBody.loadType(); //대상 생성하기
}
public static void main(String args[]) throws Exception {
Type first = TypeBody.getType(1); //사용하는 모습
Type second = TypeBody.getType(2);
first.printer();
second.printer();
}
}
데이터베이스나 Properties같은 곳에서 대상을 한번 불러온 이후에 바뀔일이 없다면 프로토타입 패턴같이 객체를 사용하는 것도 좋은 방법이다. 물론 if를 활용해서 비슷하게 하는 방법도 있지만..
반응형
'디자인 패턴' 카테고리의 다른 글
디자인패턴 - 빌더 패턴 (0) | 2019.05.02 |
---|---|
디자인패턴 - 싱글톤 패턴 (0) | 2019.05.02 |
디자인패턴 - 팩토리 패턴 (0) | 2019.05.02 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글