Prototype (프로토타입 패턴)
13 May 2019 | design pattern programming softwarePrototype Pattern
인스턴스를 생성할 때 클래스 이름을 지정하지 않고 인스턴스를 생성할 때도 있다.
클래스로부터 인스턴스를 만드는 것이 아니라 인스턴스를 복사해서 새로운 인스턴스를 만든다.
- 종류가 많아 클래스로 정리되지 않거나
- 클래스로부터 인스턴스 생성이 어렵거나
- framework와 생성할 인스턴스를 분리하고 싶을 때
완구점에서 토끼 인형, 고양이 인형의 인스턴스를 만들어놓고 복사하여 만든뒤 사용한다고 생각하고 구현한 예제
Main.java
public class Main {
public static void main(String[] args) {
Manager manager = new Manager();
BunnyDoll bunnyDoll = new BunnyDoll("BND1011");
CatDoll catDoll = new CatDoll("CDL1012");
manager.register("my bunny doll", bunnyDoll);
manager.register("my cat doll", catDoll);
Product p1 = manager.create("my bunny doll");
p1.use("tom");
Product p2 = manager.create("my cat doll");
p2.use("sally");
}
}
Manager.java
public class Manager {
private HashMap showcase = new HashMap();
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();
}
}
Product.java
public interface Product extends Cloneable {
public abstract void use(String s);
public abstract Product createClone();
}
CatDoll.java
public class CatDoll implements Product {
private String modelNumber;
public CatDoll(String modelNumber) {
this.modelNumber = modelNumber;
}
@Override
public void use(String s) {
System.out.println("catDoll modelNumber: " + modelNumber + ", name: " + s + "\"");
}
@Override
public Product createClone() {
Product p = null;
try {
p = (Product) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
BunnyDoll.java
public class BunnyDoll implements Product {
private String modelNumber;
public BunnyDoll(String modelNumber) {
this.modelNumber = modelNumber;
}
@Override
public void use(String s) {
System.out.println("bunnyDoll modelNumber: " + modelNumber + ", name: " + s + "\"");
}
@Override
public Product createClone() {
Product p = null;
try {
p = (Product) clone();
} catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}