Prototypeパターン@Java言語で学ぶデザインパターン入門

Java画像

参考書籍

prototypeパターンとは

クラスからインスタンスを生成するのではなく、インスタンスから別のインスタンスを作り出パターンをprototypeパターンという

メリット

以下の3つに当てはまるときに使うと良いでしょう

  1. 種類が多すぎてクラスにまとめられない場合
  2. クラスからのインスタンス生成が難しい場合
  3. フレームワークと生成するインスタンスを分けたい場合

サンプルコード

Foodクラス

複製を可能にするためのインターフェース。

Cloneableインターフェースを継承させることで、cloneメソッドを使って自動的に複製を行うことができるようになります。

ちなみにCloneableインターフェースはoverrideする関数がないのが特徴です。

このようなインターフェースを「マーカーインターフェース」と呼びます

Managerクラス

ManagerクラスはFoodインターフェースを利用してインスタンスの複製を行うクラスです。

クラス内に、Foodクラス、Fishクラスなど具体的なクラス名が出てこないことがポイントです!

これにより、Food,Managerクラスが独立して修正できるようになります。

ConcreteFoodクラス

本来このクラスはなくても良いのですが、後述するFish,Fruitsクラスに全く同じcreateCopy()メソッドを書きたくないので、作りました。

このクラスのポイントはcreateCopy()メソッドで自分自身の複製を作成しているところです。

注意すべきはclone()メソッドはシャローコピーというところです。

ディープコピーをしたい場合はcloneメソッドをオーバーライドして実装する必要があります。

CloneNotSupportedExceptionが投げられるときはClonealeインターフェースを実装していないクラスがcloneメソッドを読んだときです。

Fishクラス

Fruitsクラス

mainクラス

まとめ

ここまできて恐縮なんですが、どうやらcloneメソッドは使い勝手が悪く、普通にコピーコンストラクタを定義した方が良いのでは?

と参考書には記載されています:)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


error: Content is protected !!