Post

java Prototype pattern 실습해보기

java Prototype pattern 실습해보기

지난 시간에 이어서 이번에도 prototype pattern을 실습하며 배워보려합니다.

생산 비용이 높은 인스턴스를 복사로 쉽게 생성 할 수 있도록 하는 패턴입니다.

종류가 많아서 클래스로 정리되지 않는 경우와 클래스로부터 인스턴스 생성이 어려운 경우를 생산 비용이 높은 인스턴스라고 생각할 때, 또 다른 객체를 생성할 시 복제를 할 수 있습니다.

java

복사할 수 있게 준비하고 사용하는 패턴이므로 java에서는 메소드가 준비되어 있어서 편합니다.

코드

웹사이트 코드를 복제한다고 가정해봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Clone implements Cloneable {
	
	private String id = "readl id";

	public String getId() {
		return id;
	}
	
	public void setId(String id) {
		this.id = id;
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
}

웹사이트의 고유 이름을 id라고 가정하고, 이 고유적인 객체를 복제할 수 있게 자바에서 기본으로 제공해주는 Cloneable 추상 메소드를 불러와서 구현합니다.

그리고, getter와 setter를 생성하여 private 접근 지정자를 외부에서 접근 가능하게 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
	
	private int password;

	public Website(int password) {
		super();
		this.password = password;
	}

	public void setPassword(int password) {
		this.password = password;
	}
	
	public int getPassword() {
		return password;
	}
	
	Clone copy() throws CloneNotSupportedException {
		Clone Website = (Clone) clone();
		return Website;
	}

}

예제 코드이기에 간단하게 비밀번호라고 예시를 지었습니다.

위와 마찬가지로 private 변수를 생성하고 getter와 setter를 생성해줍니다.

그리고 생성자를 이용해서 메인 클래스에서 인자를 조작할 수 있도록 합니다.

마지막으로 중요한 복사 메소드를 작성합니다. 위의 최상단 클래스의 clone 메소드를 이용하여 해당 웹사이트 객체를 반환해줍니다.

1
2
3
4
5
6
7
8
9
10
public class Main {

	public static void main(String[] args) throws CloneNotSupportedException {
		Website test = new Website(1234);
		Website test_copy = (Website) test.copy();
		
		System.out.println(test.getId()+"\n"+test_copy.getId() + "\n" + test.getPassword()+ "\n" + test_copy.getPassword());
	}

}

메인 클래스에서 원본 객체를 만들면서 비밀전호 인자를 1234로 임의로 넣었습니다.

이렇게 넣게되면 해당 객체의 비밀번호는 1234가 됩니다.

이 상태로 두번째 복사 객체를 만듭니다. 이번에는 웹사이트 클래스의 copy 메소드를 이용하여 clone한 객체를 반환 받습니다.

그렇게 출력하게 되면 별도로 설정하지 않아도 비밀번호 변수는 같아지게 됩니다.

This post is licensed under CC BY 4.0 by the author.