Patterns
Prototype 패턴 - 복사해서 인스턴스 만들기
Caprica Six
2013. 5. 3. 06:49
.
클래스이름을 지정하지 않고 인스턴스를 생성할 때.
- 종류가 너무 많아 클래스로 정리되지 않는 경우
- 클래스로부터 인스턴스 생성이 어려운 경우
- framework와 생성할 인스턴스를 분리하고 싶은 경우
.
package framework; public interface Product extends Cloneable { public abstract void use(String s); public abstract Product createClone(); }. . .
package framework; import java.util.HashMap; public class Manager { private HashMap<String, Product> showcase = new HashMap<String, Product>(); public void register(String name, Product proto) { showcase.put(name, proto); } public Product create(String protoname){ Product p = (Product) showcase.get(protoname); return p.createClone(); } }. . .
import framework.*; public class MessageBox implements Product{ private char decochar; public MessageBox(char decochar) { super(); this.decochar = decochar; } @Override public void use(String s) { int length = s.getBytes().length; for (int i=0; i<length+4;i++){ System.out.print(decochar); } System.out.println(""); System.out.println(decochar + " " + s + " " + decochar); for (int i=0; i<length+4;i++){ System.out.print(decochar); } System.out.println(" "); } @Override public Product createClone() { Product p = null; try { p = (Product) clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } }. . .
import framework.Product; public class UnderlinePen implements Product{ private char ulchar; public UnderlinePen(char ulchar) { super(); this.ulchar = ulchar; } @Override public void use(String s) { int length = s.getBytes().length; System.out.println("\"" + s + "\""); System.out.print(" "); for(int i=0; i<length; i++){ System.out.print(ulchar); } System.out.println(""); } @Override public Product createClone() { Product p = null; try { p = (Product) clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } }. . .
import framework.Manager; import framework.Product; public class Main { public static void main(String[] args) { //준비 Manager manager = new Manager(); UnderlinePen upen = new UnderlinePen('~'); MessageBox mbox = new MessageBox('*'); MessageBox sbox = new MessageBox('/'); manager.register("strong message", upen); manager.register("warning box", mbox); manager.register("slash box", sbox); //생성 Product p1 = manager.create("strong message"); p1.use("Hello, world."); Product p2 = manager.create("warning box"); p2.use("Hello, world."); Product p3 = manager.create("slash box"); p3.use("Hello, world."); } }. . .
"Hello, world." ~~~~~~~~~~~~~ ***************** * Hello, world. * ***************** ///////////////// / Hello, world. / /////////////////
.
Prototype 패턴의 등장인물
- Prototype(원형)의 역할
Prototype은 인스턴스를 복사하여 새로운 인스턴스를 만들기 위한 메소드를 결정.
Product 인터페이스
- ConcretePrototype(구체적인 원형)의 역할
ConcretePrototype은 인스턴스를 복사해서 새로운 인스턴스를 만드는 메소드를 실제로 구현.
MessageBox 클래스, UnderlinePen 클래스
- Client(이용자)의 역할
Client는 인스턴스를 복사하는 메소드를 이용해서 새로운 인스턴스를 생성.
Manager클래스
clone 메소드와 java.lang.Cloneable 인터페이스
- cloneable 인터페이스 : http://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html
- clone 메소드 : http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()
..