Prototypeプロトタイプ-デザインパターンの勉強
Prototypeプロトタイプ。
prototype「原型」「模範」という意味。
原型となるインスタンスを作成し、それをコピーして新しいインスタンスを作る場合に用いるデザインパターンです。
Javaデザインパターン徹底攻略 (標準プログラマーズライブラリ)に載っているサンプルプログラムは以下の通り。
クラス | 説明 |
---|---|
MyParameter.java | int型整数を保持するオブジェクト。 |
MyMain.java | テスト用 |
MyParameter.java 1 public class MyParameter implements Cloneable { 2 private int value; 3 public MyParameter(int value) { 4 this.value = value; 5 } 6 public Object clone() throws CloneNotSupportedException { 7 return super.clone(); 8 } 9 }
MyMain.java 1 public class MyMain { 2 public static void main(String args[]) { 3 MyParameter max = new MyParameter(100); 4 MyParameter def = new MyParameter(10); 5 MyParameter min = new MyParameter(1); 6 7 MyParameter[] samples = new MyParameter[100]; 8 java.util.Random rand = new java.util.Random(); 9 10 try { 11 for(int i=0;i<100;i++){ 12 int r = rand.nextInt(10); 13 if(r > 8) { 14 samples[i] = (MyParameter)max.clone(); 15 } else if (r > 6) { 16 samples[i] = (MyParameter)min.clone(); 17 } else { 18 samples[i] = (MyParameter)def.clone(); 19 } 20 } 21 } catch(CloneNotSupportedException ex) { 22 System.out.println("error"); 23 } 24 } 25 }
オブジェクトをコピーするには
javaにはオブジェクトをコピーするクラスであるCloneableインターフェースが用意されている。
このインターフェースを実装するには以下の3点を守る必要があります。
- Cloneableインターフェースをimplementsする。
- cloneメソッドをオーバライドする。戻り値はObject型。
- cloneメソッドはCloneNotSupportedExceptionをthrowする。
MyParameter.javaではこれらが守られている。
簡略化
MyMain.javaでは以下のように最初に最大値、デフォルト値、最小値を保持するインスタンスを作成しています。
3 MyParameter max = new MyParameter(100); 4 MyParameter def = new MyParameter(10); 5 MyParameter min = new MyParameter(1);
これにより、それ以降では「100が最大値であること」や「10がデフォルト値」「1が最小値」などを意識する必要がなくなります。
そして、
14 samples[i] = (MyParameter)max.clone();
のようにメソッドclone()を使って、オブジェクトを容易にコピーすることができるようになります。
雑記
・オブジェクトが動的に複数必要な場合は便利そうだな。
・しかし、具体的にはメソッドclone()使う場面が想像できないな。