Prototypeパターン
今まで、あるクラスのインスタンスを作成する場合、
new クラス名();
とクラス名を指定していた。
システムの構造においては、少しだけ異なる似たような処理に対してたくさんのクラスを作らなければならなくなり、そのインスタンスを作るたびに毎回newでインスタンスを作成する必要が出てくる。
しかし、クラス名を指定せずにインスタンスを作成したくなる場面も多くある。
例えば
1.オブジェクトが多すぎるためにクラスにまとめられない場合
1つ1つ別クラスにしていたら、ソースファイルを多数作成する必要が生じてしまう場 合。
2.クラスからのインスタンス生成が難しい場合
これはあまり初級者には起こりえないが、グラフィックソフトなどでユーザが作成した図形インスタンスがあり、それを作りたい場合など
3.フレームワークと生成するインスタンスを分けたい場合
インスタンス生成のためのフレームワークを、特定のクラスに依存させたくないと き。クラス名を指定してインスタンスを作成するのでなく、あらかじめひな型になるインスタンスを配列などに登録し、そのインスタンスをコピーすることでインスタンスを生成する。
こんな場合に効果的なのが、Prototypeパターンである。
クラス名を指定してnewでインスタンスを作成するのでなく、あらかじめひながたのインスタンスを生成した上で、そのインスタンスをコピーして用いる。
このパターンでは、主に3つの機能をもったクラスが存在する。
1.新しいインスタンスを作る
2.新しいインスタンスを作るためのメソッドを定めるインターフェース
3.2の抽象メソッドに対する実装を行う
基本的なながれとしては
・1のクラスのインスタンスを作成し、ひながたとなるインスタンスを登録する。
登録されたインスタンスは、HashMapにより、ある名前と対応する。
・あらかじめひながたとして登録されているインスタンスを取得する。
・そのインスタンスがもつcloneメソッドを呼び出し、新たにコピーされたインスタンスが新しいインスタンスとして作成される。
cloneメソッドは、すべてのクラスのおおもとのスーパークラスであるobjectクラスが持つメソッドであり、その対象のインスタンスと同じメモリ容量の空間を新たに作成した上で、対象のインスタンスのフィールドをコピーする。
cloneメソッドにおいては、shallowコピーと呼ばれるコピーの方法で新たにコピーインスタンスが作成される。
shallowコピーについてはまた別途エントリを書きたいと思う。