prototypeパターンとはざっくり言うと、原型となるオブジェクトを複製して新たなオブジェクトを生成
するパターンと言えるでしょうか。
Javaオブジェクトは、メソッドClone()を使って複製することができます。
Jobj j1 = (Jobj)j0.clone();
メソッドclone()は、常にObject型を返しますのでクローン生成しようとしているオブジェクトの実際の
型にキャストしなければなりません。このメソッドには下記の制約があります。
・ protetedなメソッドであり、同じクラスあるいはサブクラスからのみ呼び出せる。
・インターフェースCloneableをimplementsすると宣言されたオブジェクトだけがクローン生成できる。
クラスObjectのメソッドclone()はprotectedですから、具象クラス中にpublicなクローンメソッドを作り
そこからprotectedなclone()にアクセスします。
簡単な例を見てみましょう。
// prototype
public class SoccerSenshu implements Cloneable {
private String name;
public SoccerSenshu(String name) {
this.name = name;
}
public Object cloneMe() throws CloneNotSupportedException {
return super.clone();
}
public String toString() {
return "選手名は " + name;
}
}
// クライアントクラス
public class Client_Cloneable {public static void main(String args[]) throws CloneNotSupportedException {
SoccerSenshu senshu1 = new SoccerSenshu("マラドナ");
SoccerSenshu senshu2 = (SoccerSenshu) senshu1.cloneMe(); // クローン
System.out.println(senshu1);
System.out.println(senshu2);
}
}
実行結果
選手名は マラドナ
選手名は マラドナ
同じオブジェクトがコピーされましたね。
しかしそもそも何故複製が必要なのでしょうか?
例としてある答えを得るのに、大規模なデータベースに数多くの問い合わせが必要となる場合、
その答えがテーブルあるいはResultSetとして一旦得られれば、それを操作することによって
(他に問い合わせを発行することなく)別の答えも導き出せるでしょう。
このように負荷の大きい作業を軽減する目的で使われることが多いです。
人気ブログランキングへ
0 件のコメント:
コメントを投稿