試作パターン


プロトタイプ パターンは、パフォーマンスを確保しながら繰り返しオブジェクトを作成するために使用されます。このタイプのデザイン パターンは創造的なパターンであり、オブジェクトを作成するための最適な方法を提供します。

このパターンは、現在のオブジェクトのクローンを作成するために使用されるプロトタイプ インターフェイスを実装します。このモードは、オブジェクトを直接作成するコストが比較的高い場合に使用されます。たとえば、高価なデータベース操作の後にオブジェクトを作成する必要があります。オブジェクトをキャッシュし、次のリクエストでそのクローンを返し、必要に応じてデータベースを更新してデータベース呼び出しを減らすことができます。

はじめに

目的: プロトタイプ インスタンスを使用して、作成するオブジェクトのタイプを指定し、これらのプロトタイプをコピーして新しいオブジェクトを作成します。

主なソリューション: 実行時にプロトタイプを作成および削除します。

いつ使用するか: 1. システムがその製品とは独立して作成、構成、表現される必要がある場合。 2. インスタンス化されるクラスが実行時に (動的ロードなどにより) 指定される場合。 3. 製品クラス階層と並行してファクトリ クラス階層を作成しないようにするため。 4. クラスのインスタンスが、複数の異なる状態の組み合わせのうち 1 つだけを持つことができる場合。毎回適切な状態でクラスを手動でインスタンス化するよりも、対応する数のプロトタイプを作成してクローンを作成する方が便利な場合があります。

解決方法: 既存のプロトタイプ オブジェクトを使用して、プロトタイプ オブジェクトと同じインスタンスをすばやく生成します。

キーコード: 1. クローン作成操作を実装するには、JAVA で Cloneable を継承し、clone() をオーバーライドします。オブジェクト クラスの MemberwiseClone() メソッドを使用して、オブジェクトの浅いコピーを実装するか、シリアル化を通じてディープコピーを実装します。 2. プロトタイプ パターンは、クラス オブジェクトのユーザーと特定のタイプ (揮発性クラス) の間の結合関係を分離するためにも使用されます。また、これらの「揮発性クラス」が安定したインターフェイスを持つことも必要です。

応用例: 1. 細胞分裂。 2. JAVA のオブジェクト clone() メソッド。

利点: 1. パフォーマンスの向上。 2. コンストラクターの制約をエスケープします。

欠点: 1. クローン メソッドを装備するには、クラスの機能を包括的に考慮する必要があります。これは、新しいクラスにとっては難しくありませんが、特にクラス参照がシリアル化をサポートしていない場合は、必ずしも簡単ではありません。間接オブジェクト、または参照に循環構造が含まれる場合。 2. Cloneable インターフェイスを実装する必要があります。 3. コンストラクターの制約をエスケープします。

使用シナリオ: 1. リソース最適化シナリオ。 2. クラスの初期化では、データ、ハードウェア リソースなど、多くのリソースを消化する必要があります。 3. パフォーマンスとセキュリティ要件のあるシナリオ。 4. new によるオブジェクトの生成に非常に面倒なデータの準備やアクセス権が必要な場合は、プロトタイプ モードを使用できます。 5. オブジェクトの複数のモディファイアを含むシナリオ。 6. オブジェクトが他のオブジェクトからアクセスされる必要があり、各呼び出し元がその値を変更する必要がある場合は、プロトタイプ モードを使用して、呼び出し元が使用できるように複数のオブジェクトをコピーすることを検討できます。 7. 実際のプロジェクトでは、プロトタイプ パターンが単独で現れることはほとんどありません。通常、オブジェクトは clone メソッドによって作成され、ファクトリ メソッドによって呼び出し元に提供されます。プロトタイプ パターンは Java に統合されており、誰でも使用できます。

注: クラスをインスタンス化して新しいオブジェクトを構築するのとは異なり、プロトタイプ パターンは既存のオブジェクトをコピーすることによって新しいオブジェクトを生成します。浅いコピーは Cloneable、rewrite を実装し、deep copy はバイナリ ストリームを読み取るための Serializable を実装します。

実装

抽象クラスShapeと、Shapeクラスを拡張するエンティティクラスを作成します。次のステップは、クラス ShapeCache を定義することです。このクラスは、シェイプ オブジェクトを Hashtable に保存し、リクエストに応じてそのクローンを返します。

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

原型模式的 UML 图

ステップ 1

Clonable インターフェースを実装する抽象クラスを作成します。

Shape.java

public abstract class Shape implements Cloneable {
   
   private String id;
   protected String type;
   
   abstract void draw();
   
   public String getType(){
      return type;
   }
   
   public String getId() {
      return id;
   }
   
   public void setId(String id) {
      this.id = id;
   }
   
   public Object clone() {
      Object clone = null;
      try {
         clone = super.clone();
      } catch (CloneNotSupportedException e) {
         e.printStackTrace();
      }
      return clone;
   }
}

ステップ2

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

Rectangle.java

rreee

square.java

rreee

circle.java

public class Rectangle extends Shape {

   public Rectangle(){
     type = "Rectangle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

step

ShapeCache.java

public class Square extends Shape {

   public Square(){
     type = "Square";
   }

   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

ステップ 4

PrototypePatternDemo

ShapeCache

クラスを使用して、Hashtable に保存されている形状のクローンを取得します。 PrototypePatternDemo.java

public class Circle extends Shape {

   public Circle(){
     type = "Circle";
   }

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

ステップ 5 出力を確認します。

りー