Latest web development tutorials

プロトタイプモデル

プロトタイプモデル(原型パターン)性能を確保しつつ、複製オブジェクトを作成するために使用されます。 デザインパターンのこのタイプのオブジェクトを作成するための最良の方法を提供する、スキーマを作成属します。

このモデルは、現在のオブジェクトのクローンを作成するために使用されるプロトタイプのインターフェースです。 オブジェクトの作成の直接コストが比較的大きい場合は、このモデルを使用して。 データベースは高価な操作された後、例えば、オブジェクトが作成される必要があります。 我々は、次回のデータベースコールを低減するために、そのクローンにデータベースを更新するのに必要な時間を返すように要求し、オブジェクトをキャッシュすることができます。

入門

意図:指定されたオブジェクト型のインスタンスを作成し、プロトタイプをコピーして新しいオブジェクトを作成するために使用したプロトタイプ。

主に解決するために:作成し、実行時にプロトタイプを削除します。

使用するとき:1を、システムがその製品の作成、組成や表現の独立していなければならないとき。クラスのインスタンスは、実行時に、例えば、ダイナミックローディングによって指定される2、。 時ファクトリクラスパラレルクラス階層および製品階層を作成しないようにするために3、。 図4に示すように、クラスのインスタンスが一度状態のいくつかの異なる組み合わせを有することができます。 プロトタイプの対応する番号を確立し、それらはクラスのインスタンスの適切な状態で各タイムマニュアルよりも便利かもしれクローン。

既存のプロトタイプオブジェクトの使用を、素早くインスタンスとしてプロトタイプオブジェクトを生成します解決方法

キーコード:1、クローニング操作を達成するために、JAVA継承Cloneableを、クローンを書き換える()、ディープコピーを達成するために、浅いコピーまたはシリアル化方法の目的を達成するために、.NETオブジェクトクラスMemberwiseClone()メソッドで使用することができます。2、ユーザーおよびクラスオブジェクト間の特定のタイプ(変数型)の単離の間に結合するための同じプロトタイプモデル、それはまた、これらの「変数の型」は安定したインタフェースを持っている必要があります。

応用例:1、細胞分裂。2、オブジェクトのクローン()メソッドでJAVA。

利点:1、性能が改善されます。2制約コンストラクタを逃れます。

短所:1、クローニング法では、新しいクラスは困難ではありませんが、既存のクラスのクラス参照が間接オブジェクトのシリアル化をサポートしていない場合は特に、非常に容易ではない可能性がある、考慮に関数のクラスを取る必要があり、または時間への参照を含む環状構造。2は、Cloneableインタフェースを実装する必要があります。 3、制約コンストラクタを避けます。

使用シナリオ:1、リソースの最適化シナリオ。2、クラスの初期化は、リソースデータ、ハードウェアリソースを含め、多くの資源を消化する必要があります。 シーンの3、性能と安全性の要件。 4は、新しいオブジェクトを生成することは非常に面倒な準備やデータへのアクセスを必要とすることによって、あなたはプロトタイプモデルを使用することができます。 5、シーンによって修飾複数のオブジェクト。 6、オブジェクトは他のオブジェクトへのアクセスを提供する必要があり、それぞれの発信者は、発信者によって使用されるオブジェクトの複数のコピーのためのプロトタイプモデルを使用することを検討し、その値を変更する必要があります。 図7は、実際のプロジェクトでは、プロトタイプモデルはほとんど単独で発生していない、とFactory Methodパターンは、一般的に、一緒に表示されるオブジェクトcloneメソッドを作成し、ファクトリメソッドにより、呼び出し側に提供します。 Javaのプロトタイプモデルは、容易に使用するために使用することができ、一体的な全体として組み込まれています。

注:新規オブジェクトを構築するためにインスタンス化することによって、クラスが異なると、プロトタイプモデルは、既存のオブジェクトをコピーして、新しいオブジェクトを生成することです。浅いコピーは深いコピーはSerializableを実装することにより、バイナリストリームを読み出し、書き換え、Cloneableを実現します。

実現

私たちは、抽象クラスの形状を作成し、エンティティクラスのShapeクラスを拡張します。 次のステップはそのようなオブジェクトの形状はでHashtableに格納されているクラスShapeCacheを定義することで、要求時に自分のクローンに戻ります。

PrototypPatternDemo、Shapeオブジェクトを取得するにはShapeCacheクラスを使用して、私たちのデモクラス。

プロトタイプモデルのUMLダイアグラム

ステップ1

インタフェースクローニング可能なを実装する抽象クラスを作成します

Shape.java

パブリック抽象クラスの形状は、{Cloneableをを実装します
   
   プライベート文字列ID。
   保護された文字列型。
   
   抽象ボイドドロー();
   
   公共の文字列のgetType(){
      戻り値の型。
   }
   
   公共の文字列のgetId(){
      IDを返します。
   }
   
   公共ボイドSETID(文字列ID){
      this.id = ID;
   }
   
   パブリックオブジェクトのクローン(){
      オブジェクトのクローン= nullを。
      {しよう
         クローン= super.clone();
      }キャッチ(CloneNotSupportedException電子){
         e.printStackTrace();
      }
      クローンを返します。
   }
}

ステップ2

上記の抽象クラスを拡張するエンティティクラスを作成します。

Rectangle.java

パブリッククラス長方形は{シェイプを拡張します

   公共長方形(){
     タイプ= "長方形";
   }

   @Override
   公共ボイドドロー(){
      System.out.println( "内部長方形::ドロー()メソッド。");
   }
}

Square.java

パブリッククラススクエア{シェイプを拡張します

   パブリックスクエア(){
     タイプ= "スクエア"。
   }

   @Override
   公共ボイドドロー(){
      System.out.println( "インサイド広場::ドロー()メソッド。");
   }
}

Circle.java

パブリッククラスサークル{シェイプを拡張します

   公共のサークル(){
     タイプ= "サークル"。
   }

   @Override
   公共ボイドドロー(){
      System.out.println( "内部サークル::ドロー()メソッド。");
   }
}

ステップ3

クラスを作成し、データベースからエンティティークラスを取得し、中のHashtableに格納します。

ShapeCache.java

インポートされたjava.util.Hashtable;

パブリッククラスShapeCache {
	
   プライベート静的Hashtableの<文字列、シェイプ> shapeMap 
      =新しいHashtableの<文字列、シェイプ>();

   パブリック静的形状getShape(文字列shapeId){
      形状cachedShape = shapeMap.get(shapeId)。
      リターン(シェイプ)cachedShape.clone();
   }

   //各形状の実行データベースクエリの場合、および形状// shapeMap.put(shapeKey、形状)を作成します。
   //たとえば、我々は{)(パブリック静的ボイドloadCacheを3図形を追加します
      サークルサークル=新しいサークル();
      circle.setId(「1」)。
      shapeMap.put(circle.getId()、円)。

      スクエア四角=新スクエア();
      square.setId(「2」)。
      shapeMap.put(square.getId()、四角)。

      四角形四角形=新しいRectangle();
      rectangle.setId(「3」)。
      shapeMap.put(rectangle.getId()、長方形)。
   }
}

ステップ4

PrototypePatternDemoは、クローンの形状はHashtableに格納されて得るためにShapeCacheクラスを使用ます。

PrototypePatternDemo.java

パブリッククラスPrototypePatternDemo {
   公共の静的な無効メイン(文字列[] args){
      ShapeCache.loadCache()。

      clonedShape =(形状)ShapeCache.getShape形状(「1」)。
      System.out.println( "形状:" + clonedShape.getType());		

      clonedShape2 =(シェイプ)ShapeCache.getShape形状( "2");
      System.out.println( "形状:" + clonedShape2.getType());		

      clonedShape3 =(シェイプ)ShapeCache.getShape形状( "3");
      System.out.println( "形状:" + clonedShape3.getType());		
   }
}

ステップ5

出力を確認します。

形状:サークル
形状:スクエア
形状:長方形