デザインパターンとは、システム設計におけるクラスやインターフェースの関係に名前をつけたものです。 GoFの23のパターンが有名です。デザインパターンというのは、どんなパターンなのか、パターンの目的は何かということを覚えることが非常に重要なのですが、これを実際に適用しようとした場合に、いつ適用していいかが見えてこないとお話になりません。

そこで、自分の勉強も兼ねつつ、パターンの実践時における使用場所や、パターンを適用するきっかけを見つけられるようにメモしておきます。

11個目はインスタンスを新しく作るときに、既存のインスタンスのコピーを作成するPrototypeパターンのメモです。

Prototypeパターン

Prototypeパターンは、既存のインスタンスのコピーを使って、生成の複雑なインスタンスや、少しだけ違うインスタンスをたくさん作りたいときに使えるパターンです。

どんな時にこのパターンが使えるかというと、例えば株のシミュレーションプログラムを作っているとします。株価がこの先どのように変化するかを調べたいときに、現時点の株インスタンスの状態を複製して、別々の条件に当てはめたい場合、まったく同じ株インスタンスが必要となります。こんな状況にPrototypeパターンが使えます。

他には、ドローツール(お絵かきソフト)を作っているとすると、ユーザの書いた絵インスタンスは、とても複雑な状態になっていると考えられます。このインスタンスは、プログラムで同じものを作るのは、非常に大変です。(描いた手順をすべて覚えておいて、作るとなると時間もコストもかかる)こんなとき、絵インスタンスの複製を作ることができれば、描いた手順なんて必要なくなります。

3つ目は、テンプレートとなるインスタンスがすでに存在する場合です。テンプレートインスタンスを複製して、少し状態を変化させることで、同じような処理を何度も行わなくてすむようになります。

パターンの適用タイミング

Webアプリケーションなどを作っていると、ウィザード形式の処理を行う場合があります。入力して、確認して、登録するという一連の処理がある場合、登録時にエラーが発生してしまったら、入力時点まで、インスタンスの状態を戻さなければなりません。 こんなとき、インスタンスの複製を作っておいて、複製の方で登録処理を行い、エラーが出たら、複製元のインスタンスを処理するようにすれば複雑な処理は一切いらなくなります。

Prototypeパターンが使えそうな状況は、インスタンスを複製(コピー)しておいて、試しになにか処理してみる場合複雑な生成過程を経たインスタンスをもう一度作りたい場合テンプレートインスタンスが存在し、コピーすることで処理が楽になる場合

Prototypeパターンを使うときの注意点は、コピーの深さを間違えないことです。最近の言語は、オブジェクトの参照を扱います。コピーの深さを間違えると、見た目だけコピーされているが、実は中身は同じ参照だったということがありえます。詳しい解説は、Effective Javaという本が参考になります。

Web上だとSun MicrosystemsのJDC Tech Tips 日本語版がよさそうでした。(※このページは会員制です。無料ですので登録してから、読んでみてください。)

実装サンプルと参考文献

Prototypeパターンの実装方法をもっと詳しく知りたい場合は、下記のサイトにアクセスするのをお勧めします。もしくは、参考書籍を載せておきますので、そちらをお買い求めください。(^^;


  • 独習シリーズのデザインパターン編。デザインパターンを一人でも学べます。

  • Sun Microsystemのお墨付き。GoF以外のパターンも学べます。

  • UMLを使って、オブジェクト指向のいいとこ取りができます。

  • デザインパターンだけではなく、ソフトウェア設計の原則やプラクティスまで学びたい人におすすめ