「Prototype」という英単語は、「原型」・「模範」を意味します。
javaでは、複製を作る操作を「Object」クラスが提供する「clone」メソッドを利用して行います。通常は、「クラス」から「オブジェクト」を作成という手順(newを用いて)となりますが、このパターンにおいては、「オブジェクト」から「オブジェクト」(複製)を作成します。
Prototypeパターンのクラス図
1. Client.java
import java.util.Map; import java.util.HashMap; public class Client { private Map<String, Prototype> hashmap = new HashMap<String, Prototype>(); public void regist(String key, Prototype prototype){ hashmap.put(key, prototype); } public Prototype create(String key){ Prototype prototype = hashmap.get(key); return prototype.createClone(); } }
2. Prototype.java
/** cloneメソッドを使用したい場合は、そのスーパークラス・インタフェースのどこかでCloneableインタフェースを実装していないといけません。 ※ Cloneableインタフェースには抽象メソッドが1つも定義されていません。単にそのクラスが、cloneできるか否かのマーク付けをしているだけです。*/ public abstract class Prototype implements Cloneable { public abstract Prototype createClone(); }
3. ConcretePrototype.java
public class ConcretePrototype extends Prototype {
private int id;
public ConcretePrototype(int id){
this.id = id;
}
public Prototype createClone() {
ConcretePrototype concretePrototype = null;
try {
concretePrototype = (ConcretePrototype)this.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return concretePrototype;
}
public int getId(){
return id;
}
}
4. PrototypeUser.java
public class PrototypeUser { public static void main (String[] args){ Client client = new Client(); ConcretePrototype cp1 = new ConcretePrototype(0); ConcretePrototype cp2 = new ConcretePrototype(1); ConcretePrototype cp3 = new ConcretePrototype(2); client.regist("0", cp1); client.regist("1", cp2); client.regist("2", cp3); Prototype prototype1 = client.create("0"); Prototype prototype2 = client.create("1"); Prototype prototype3 = client.create("2"); System.out.println(((ConcretePrototype)prototype1).getId()); System.out.println(((ConcretePrototype)prototype2).getId()); System.out.println(((ConcretePrototype)prototype3).getId()); } }
C:\sample\desin_pattern\prototype>javac PrototypeUser.java [Enter] C:\sample\desin_pattern\prototype>java PrototypeUser [Enter] 0 1 2
1番ポピュラーな生成方法です。
String str = new String();
java.lang.Objectオブジェクトが定義しているcloneメソッドを使用して自身のコピーを生成します。
※cloneメソッドを使用したい場合は、Cloneableインタフェースを実装しておく必要があります。
※コンストラクタは呼ばれません。
class A implements Cloneable { public Object copy(){ A a = null; try { a = (A)clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return a; } }
java.lang.Classオブジェクトが定義しているnewInstanceメソッドを使用して、生成します。
※「InstantiationException」「IllegalAccessException」を例外として投げるので例外処理をしておく必要があります。
※引数なしコンストラクタ(デフォルト)が呼ばれます。
完全修飾クラス名を元にオブジェクトを生成します。
A a = (A)Class.forName("A").newInstance();
既に生成しているオブジェクトを元にオブジェクトを生成します。
A a = new A(); A b = a.getClass().newInstance();