본문으로 바로가기

디자인패턴- 프로토타입 패턴

category 프로그래밍 언어/Java 2019. 8. 26. 18:29

프로토타입 패턴

프로토타입 패턴은 생산비용이 높은 인스턴스를 복사하여 쉽게 생성하도록 하는 패턴입니다.

 

 

요구사항

그림 그리기 개발 툴에 어떤 모양(Shape)를 그릴 수 있도록 복사 붙여넣기 기능을 구현해라. 

<조건>

대신 원을 복사할 때 좌표를 움직여라.

 

 

우선 Shape.java를 작성해줍니다. 이는 모양 클래스로 이를 원이든, 사각형이든 상속받을 클래스입니다.

package com.jeongchan.prototype;

public class Shape implements Cloneable{
	String id;
	public void setId(String id) {
		this.id = id;
	}
	public String getId() {
		return id;
	}
	
}

즉 고유 아이디가 있습니다.

 

그 다음 Circle을 만들어주고 이를 Main에서 복사기능을 구현할 것입니다. 이것이 바로 프로토타입 패턴입니다.

Circle.java에는 반지름 , 좌표가 있고 Cloneable인터페이스를 구현하여 복사 기능을 구현합니다.

package com.jeongchan.prototype;

public class Circle extends Shape {
	
	private int x,y,r;

	
	public Circle(int x, int y, int r) {
		super();
		this.x = x;
		this.y = y;
		this.r = r;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getR() {
		return r;
	}

	public void setR(int r) {
		this.r = r;
	}
	
	public Circle copy() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		Circle circle = (Circle)clone();
		circle.x = x+1;
		circle.y = y+1;
		return circle;
	}

}

copy()메소드에서 Shape의 Cloneable를 이용하여 clone()메소드를 통해 복사해줍니다. 

이는 깊은복사로 다음 게시글에서 얕은 복사와 깊은 복사의 차이점을 설명하겠습니다.

package com.jeongchan.prototype;

public class Main {
	public static void main(String[] args) throws CloneNotSupportedException{
		Circle circle1 = new Circle(1,1,3);
		Circle circle2 = circle1.copy();
		
		System.out.println(circle1.getX()+","+circle1.getY()+","+circle1.getR());
		System.out.println(circle2.getX()+","+circle2.getY()+","+circle2.getR());

	}
}

이제 메인에서 circle1을 만들어주고 복사기능을 copy()를 통해서 circle2를 만들어줍니다.

1,1,3
2,2,3

결과는 조건처럼 좌표가 1씩 이동해서 복사가 되는 것을 볼 수 있습니다.