티스토리 뷰

prototype pattern, 즉 원형패턴이란 원형이 되는 인스턴스를 활용해서 새로운 객체를 생성하는 생성패턴 중 하나이다.


원형패턴을 사용함으로써, 미리 원형으로 초기화를 해두고, 나중에 이와 같은 객체를 생성할때, 다시 초기화하지 않아도 되는 편리성을 제공한다. 즉, 새로운 객체는 일반적인 방법으로 객체를 생성(create)하는 고유의 비용이 매우 클 때, 이 비용을 감내하지 않을 수 있게 해준다. 또한, 런타임에 새로운 제품을 추가 및 삭제가 가능하고, 값들을 다양화할 수 있다.


일반적으로 원형패턴의 구조는 다음과 같다.



원형 패턴을 구현하기 위해서는 원형클래스를 다루는 원형 관리자가 있어야한다. 그리고, 복사를 해야하기 때문에, Clone연산이 필요하다.


간단하게 구현해보자. 게임에서 흔히 나오는 오크를 예를 들어 적어보겠다.


public abstract class Orc implements Cloneable {
	private int damage;
	private int speed;

	public int getSpeed() {
		return speed;
	}

	public void setSpeed(int speed) {
		this.speed = speed;
	}

	public int getDamage() {
		return damage;
	}

	public void setDamage(int damage) {
		this.damage = damage;
	}
	
	public void state() {
		System.out.format("힘 : %d, 스피드 : %d\n", damage, speed);
	} 
	
	@Override
	protected Object clone() throws CloneNotSupportedException {  
		return super.clone();
	}   
	
	public abstract void Fight();
	
}

오크라는 추상클래스를 만들고, 칼을 들거나 도끼를 든 오크를 다른 오크라고 가정하자. ( 실제로는, 이런식으로 구현하지 않는다. 예를 들기 위해 만든 코드이다. )


public class AxOrc extends Orc {

	@Override
	public void Fight() { 
		System.out.println("도끼로 싸운다.");
	} 
}
public class SwordOrc extends Orc {

	@Override
	public void Fight() {
		System.out.println("검으로 싸운다.");
	} 
} 

검으로 싸우는 오크와 칼로 싸우는 오크를 만들고, 이를 생성하는 코드를 살펴보자.


public class OrcGen {

	Orc orc = null; 
	
	public OrcGen(Orc orc){
		this.orc = orc;
	}

	public Orc makeOrc() {
		try {
			return (Orc) orc.clone();
		} catch (CloneNotSupportedException e) { 
			e.printStackTrace();
		}
		
		return null;
	} 

	public static void main(String[] args) {
		
		Orc axOrc = new AxOrc();
		Orc swordOrc = new SwordOrc();
		 
		axOrc.setDamage(20);
		axOrc.setSpeed(10); 
		
		swordOrc.setDamage(10);
		swordOrc.setSpeed(25); 
		
		OrcGen axOrcGen = new OrcGen(axOrc);
		OrcGen swordOrcGen = new OrcGen(swordOrc);
		
		for(int i=0; i<3; i++){
			System.out.print("도끼쓰는 오크 스펙 : ");
			axOrcGen.makeOrc().state();
		}  
		
		for(int i=0; i<3; i++){
			System.out.print("검 쓰는 오크 스펙 : ");
			swordOrcGen.makeOrc().state();
		} 
	}
}

하나의 객체를 만들고, 초기화를 한다. 그리고, 오크라는 몬스터가 게임상에서 많이 존재할 수 있듯, 스펙은 유지한체 계속 생성할 수 있다. 


간단하게 구현해본 위 코드의 구조는 다음과 같다.






'Paradigm > OOP' 카테고리의 다른 글

[객체지향] Proxy Pattern  (0) 2014.08.19
[객체지향] Bridge Pattern  (0) 2014.08.05
[객체지향] Abstract Factory Pattern  (0) 2014.08.04
[OOP] Refactoring  (0) 2013.11.06
[OOP] Law of demeter  (0) 2013.10.30
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday