Prototype (프로토타입 패턴)

|

Prototype 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;
    }
}