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()使う場面が想像できないな。