Prototypeパターンのコート例です。
package org.example.prototype;
import java.io.Closeable;
public interface Prototype extends Cloneable {
public void method1();
public void method2();
public Prototype createClone();
}
package org.example.prototype;
import java.io.IOException;
public class ConcretePrototype implements Prototype {
public ConcretePrototype() {
super();
}
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public Prototype createClone() {
Prototype prototype = null;
try {
prototype = (Prototype)clone();
}catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
}
package org.example.prototype;
public class Main {
public static void main(String[] args){
Prototype PrototypeObject = new ConcretePrototype();
Prototype cloneObject = PrototypeObject.createClone();
cloneObject.method1();
cloneObject.method2();
}
}
Prototypeインターフェースを実装したConcretePrototypeを作成し、以後、createClone()メソッドを使用して複製したものを使用する、という使い方をします。
Cloneableを実装しないとClone()実行時にCloneNotSupportedExceptionが発生するみたいです。
これ、Java以外にもC#とかにも無いっすかね?
※C#ではICloneableを実装すると使えるみたいです。
あと、Cloneは参照型のメンバーがいた場合、複製したObjectも複製前と同じ参照先を参照するらしいです。
完全に複製するには、CloneをOverrideして、参照型のメンバーをさらにCloneする、というやり方が必要になるようです。
Cloneを使用する場合はその当たり気をつけないといけないですね。