디렉토리 구조
Manger.java
package framework;
import java.util.*;
public class Manger {
HashMap showCase = new HashMap();
public void register(String name, Product product) {
showCase.put(name, product);
}
public Product create(String name) {
Product p = (Product) showCase.get(name);
return p.cloneObject();
}
}
Product.java
package framework;
public interface Product extends Cloneable {
public abstract void use(String s);
public abstract Product cloneObject();
}
MessageBox.java
package anonymous;
import framework.*;
public class MessageBox implements Product {
char dechar;
public MessageBox(char dechar) {
this.dechar = dechar;
}
public void use(String s) {
int length = s.getBytes().length;
for (int i = 0; i < length + 4; i++)
System.out.print(dechar);
System.out.println();
System.out.println(dechar + " " + s + " " + dechar);
for (int i = 0; i < length + 4; i++)
System.out.print(dechar);
System.out.println();
}
public Product cloneObject() {
Product p = null;
try {
p = (Product) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
Underline.java
package anonymous;
import framework.*;
public class UnderlinePen implements Product {
char dechar;
public UnderlinePen(char dechar) {
this.dechar = dechar;
}
public void use(String s) {
int length = s.getBytes().length;
System.out.println(dechar + s + dechar);
for (int i = 0; i < length + 4; i++)
System.out.print(dechar);
System.out.println();
}
public Product cloneObject() {
Product p = null;
try {
p = (Product) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
Main.java
import framework.*;
import anonymous.*;
public class Main {
public static void main(String[] args) {
Manger manger = new Manger();
MessageBox sMessage = new MessageBox('*');
MessageBox wMessage = new MessageBox('/');
UnderlinePen uMessage = new UnderlinePen('_');
manger.register("sMessage", sMessage);
manger.register("wMessage", wMessage);
manger.register("uMessage", uMessage);
Product p1 = manger.create("sMessage");
Product p2 = manger.create("wMessage");
Product p3 = manger.create("uMessage");
p1.use("Hello ProtoType");
p2.use("Hello ProtoType");
p3.use("Hello ProtoType");
}
}
위에서와 같이 객체를 등록해준 후 다시 객체를 만들 필요없이 create 안에 구현되어있는 cloneObject를 통해 객체를 복사해올 수 있습니다.
처음 말했던 것과 같이 한번 만들어 준 후 계속해서 객체를 만들어 줄 필요가없어 객체 생성 관리에 조금 더 효율적으로 사용할 수 있게 되었습니다.
clone함수만 딸랑 적어 놓고 복사가 될 까라는 생각이 들 수 있는데 java에서는 인스턴스의 복사를 실행하는 도구로 clone메소드가 준비되어 있습니다.
복사 대상이되는 클래스는 Cloneable 인터페이스를 구현할 필요가 있습니다. 복사되는 대상이나 하위 클래스 어디에서나 구현해도 상관없습니다. 여기서는 Product 인터페이스 Cloneable을 구현하고 있기때문에 오류가 발생하고 있지 않습니다.