一般にインスタンスはクラスから生成します。しかしながら、クラスを用いて1からインスタンスを生成するよりも、雛形 (Prototype) となるインスタンスを用意しておき、それをコピーして (場合によってはさらに多少の変更を加えて) 使用したほうが便利なこともあります。
sample.java
class Sample {
public static void main(String args[]) {
Client client = new Client();
client.register("typeA", new ConcretePrototype('A'));
client.register("typeB", new ConcretePrototype('B'));
client.register("typeC", new ConcretePrototype('C'));
Prototype p1 = client.create("typeA");
Prototype p2 = client.create("typeB");
Prototype p3 = client.create("typeC");
p1.greet("hi");
p2.greet("hi");
p3.greet("hi");
}
}
Client.java
import java.util.HashMap;
class Client {
private HashMap<String,Prototype> hash = new HashMap<String,Prototype>();
public void register(String key, Prototype proto) {hash.put(key, proto);}
public Prototype create(String key) {return hash.get(key).createClone();}
}
Prototype.java
interface Prototype extends Cloneable {
public abstract void greet(String s);
public abstract Prototype createClone();
}
ConcretePrototype.java
class ConcretePrototype implements Prototype {
private char val;
public ConcretePrototype(char val) {this.val=val;}
public void greet(String s) {
int length = s.getBytes().length;
for(int i=0; i<length; ++i) {System.out.print(val);}
System.out.print(" ["+s+"] ");
for(int i=0; i<length; ++i) {System.out.print(val);}
System.out.println("");
}
public Prototype createClone() {
Prototype p = null;
try {p = (Prototype)clone();}
catch(CloneNotSupportedException e) {e.printStackTrace();}
return p;
}
}
$ javac Client.java ConcretePrototype.java Prototype.java sample.java && java Sample
AA [hi] AA
BB [hi] BB
CC [hi] CC