java Prototype pattern 실습해보기
지난 시간에 이어서 이번에도 prototype pattern을 실습하며 배워보려합니다.
생산 비용이 높은 인스턴스를 복사로 쉽게 생성 할 수 있도록 하는 패턴입니다.
종류가 많아서 클래스로 정리되지 않는 경우와 클래스로부터 인스턴스 생성이 어려운 경우를 생산 비용이 높은 인스턴스라고 생각할 때, 또 다른 객체를 생성할 시 복제를 할 수 있습니다.
java
복사할 수 있게 준비하고 사용하는 패턴이므로 java에서는 메소드가 준비되어 있어서 편합니다.
코드
웹사이트 코드를 복제한다고 가정해봅니다.
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 접근 지정자를 외부에서 접근 가능하게 합니다.
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 메소드를 이용하여 해당 웹사이트 객체를 반환해줍니다.
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한 객체를 반환 받습니다.
그렇게 출력하게 되면 별도로 설정하지 않아도 비밀번호 변수는 같아지게 됩니다.