원형이 되는 클래스를 생성하고, 해당 클래스의 객체를 복제하여 새로운 객체를 만들어나가는 패턴이다. 클래스를 동일하게 유지하면서 내부의 값이나 구조를 바꿔가며 새로운 객체를 만들 수 있기 때문에 클래스의 개수를 줄일 수 있다.
- Prototype : 복제를 위해 필요한 인터페이스 정의
- ConcretePrototype : 인터페이스 구현 및 복제 연산 재정의
- Client : 복제를 요청하여 새로운 객체 생성
음악을 제작하는 코드를 구현한다고 가정해보자. 음악 제작에 필요한 공통적인 요소들로 추상 클래스(Ptototype)를 만들고, 해당 클래스를 상속하여 추가적으로 필요한 기능들을 구현한 클래스(ConcretePrototype)를 만든다. 복제를 통한 객체 생성을 위해 각각의 클래스는 Clone() 연산을 구현해야 한다.
[Music.java]
public class Music implements Cloneable {
private String name;
private String title;
public Music(String name, String title) {
this.name = name;
this.title = title;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Music music = (Music) super.clone();
music.title = this.title + "_복제품";
return music;
}
@Override
public String toString() {
return name + " - " + title;
}
}
[Client.java]
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Music music = new Music("royal44", "할 것");
Music music_clone = (Music) music.clone();
System.out.println("원본 : " + music.toString());
System.out.println("복제품 : " + music_clone.toString());
System.out.println("---------------------------------------");
System.out.println("==노래 파일 변경==");
music_clone.setName("비오");
music_clone.setTitle("네가 없는 밤");
System.out.println("복제품 : " + music_clone.toString());
}
}