Javaデザインモデルの道「五」プロトタイプモデル
2137 ワード
詳細
プロトタイプモード(Prototype)
プロトタイプモードの考え方は,1つのオブジェクトをプロトタイプとして複製,クローン化し,元のオブジェクトと類似した新しいオブジェクトを生成することである.Javaでは、コピーオブジェクトはclone()によって実現されます.
簡単で、1つのプロトタイプクラスは、Cloneableインタフェースを実現するだけで、cloneメソッドを上書きする必要があります.ここでcloneメソッドは任意の名前に変更することができます.Cloneableインタフェースは空のインタフェースなので、cloneAやcloneBなどの実装クラスのメソッド名を任意に定義することができます.一方super.clone()はObjectのclone()メソッドを呼び出し,Objectクラスではclone()はnativeである.
浅いレプリケーション:オブジェクトをレプリケーションすると、基本データ型の変数が再作成され、参照タイプ、参照タイプ、または元のオブジェクトが指します.
≪深いレプリケーション|Depth Replication|emdw≫:オブジェクトをレプリケーションすると、基本データ型と参照タイプにかかわらず再作成されます.簡単に言えば、深い複製は完全に徹底した複製を行い、浅い複製は徹底していない.
深いレプリケーションを実現するには、現在のオブジェクトのバイナリ入力をストリーム形式で読み込み、バイナリデータに対応するオブジェクトを書き出します.
プロトタイプモード(Prototype)
プロトタイプモードの考え方は,1つのオブジェクトをプロトタイプとして複製,クローン化し,元のオブジェクトと類似した新しいオブジェクトを生成することである.Javaでは、コピーオブジェクトはclone()によって実現されます.
簡単で、1つのプロトタイプクラスは、Cloneableインタフェースを実現するだけで、cloneメソッドを上書きする必要があります.ここでcloneメソッドは任意の名前に変更することができます.Cloneableインタフェースは空のインタフェースなので、cloneAやcloneBなどの実装クラスのメソッド名を任意に定義することができます.一方super.clone()はObjectのclone()メソッドを呼び出し,Objectクラスではclone()はnativeである.
浅いレプリケーション:オブジェクトをレプリケーションすると、基本データ型の変数が再作成され、参照タイプ、参照タイプ、または元のオブジェクトが指します.
≪深いレプリケーション|Depth Replication|emdw≫:オブジェクトをレプリケーションすると、基本データ型と参照タイプにかかわらず再作成されます.簡単に言えば、深い複製は完全に徹底した複製を行い、浅い複製は徹底していない.
public class Prototype implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String string;
private SerializableObject obj;
/* */
public Object clone() throws CloneNotSupportedException {
Prototype proto = (Prototype) super.clone();
return proto;
}
/* */
public Object deepClone() throws IOException, ClassNotFoundException {
/* */
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
/* */
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
public String getString() {
return string;
}
public void setString(String string) {
this.string = string;
}
public SerializableObject getObj() {
return obj;
}
public void setObj(SerializableObject obj) {
this.obj = obj;
}
}
class SerializableObject implements Serializable {
private static final long serialVersionUID = 1L;
}
深いレプリケーションを実現するには、現在のオブジェクトのバイナリ入力をストリーム形式で読み込み、バイナリデータに対応するオブジェクトを書き出します.