私たちは、デザインパターンをプロトタイプに進む前に、私たちはJavaで、クローン()メソッドで確認する必要があります。
オブジェクトのクローン作成は、オブジェクトの正確なコピーを作成する方法です。オブジェクト・クラスのクローン()メソッドは、オブジェクトをクローン化するために使用されます。
java.lang.Cloneableインターフェースは、そのオブジェクトのクローン私たちが作成するクラスによって実装されなければなりません。私たちがCloneableインタフェースを実装していない場合は、cloneメソッド
CloneNotSupportedExceptionが生成されます。
クローン()メソッドは、オブジェクトクラスで定義されています。
クローン()メソッドの利点。
clone()メソッドは、オブジェクトの正確なコピーを作成するための余分な処理タスクを保存します。私たちは、新しいキーワードを使用して実行する場合、それは多くのかかります
処理時間は、我々は、オブジェクトのクローニングを使用する理由であることに行うことができます。
クローン()は、配列をコピーする最速の方法です。
クローンのデメリット()
オブジェクトのクローン作成のデメリット
クローンのいくつかの欠点()メソッドは、次のとおりです。
- Object.clone()メソッドを使用するために、我々は、Cloneableインタフェースを実装するクローン()メソッドを定義し、CloneNotSupportedExceptionを扱うように、私たちのコードに構文の多くを変更する必要があり、そして最後に、)(Object.cloneを呼び出しなど
- 私たちは、それはそれで任意のメソッドを持っていませんがCloneableインタフェースを実装する必要があります。私達はちょうど私達が私達のオブジェクトに()クローンを実行することができますJVMを伝えるためにそれを使用する必要があります。
- Object.clone()が保護されたので、私たちは(私たち自身のクローンを提供)と、間接的にそれからObject.clone()を呼び出す必要があります。
- 我々は、オブジェクトの構築を制御することはできませんので、Object.clone()は、任意のコンストラクタを呼び出すことはありません。
- あなたは子クラスでcloneメソッドを書きたい場合は、そのスーパークラスのすべては、それらの中にクローン()メソッドを定義するか、または別の親クラスからそれを継承する必要があります。それ以外の場合は、super.clone()チェーンは失敗します。
- Object.cloneは()だけ浅いコピーをサポートしていますが、私たちは深いクローン作成が必要な場合、我々はそれをオーバーライドする必要があります。
クラス Student18は実装Cloneableを{ 2 のint rollnoと、 3 .String名。 4 。 5.Student18(int型rollno、文字列名){ 6 本 .rollno = rollno。 7. この .nameの= 名前; 8 } 9 。 10. パブリックオブジェクトクローン()スローCloneNotSupportedException { 11 リターン スーパー.cloneを(); 12 } 13 。 14. 公共の 静的な 無効メイン(文字列引数[]){ 15 試み{ 16.Student18 S1 = 新しい Student18(101、 "アミット" )。 17 。 18.Student18 S2 = (Student18)s1.clone(); 19 。 20.System.out.println(s1.rollno +」「+ s1.name)。 21.System.out.println(s2.rollno +」「+ s2.name)。 22 。 23.} キャッチ(CloneNotSupportedException c)は{} 24 。 25 } 26}
プロトタイプデザインパターン。
Prototypeパターンは心の中でパフォーマンスを維持しながら、重複オブジェクトの作成を参照します。
デザインパターンのこのタイプは、生成に関するパターンの下に来ます。
オブジェクトの作成は、直接コストがかかる場合は、このパターンが使用されています。例えば、オブジェクトは、高価なデータベース操作後に作成されるべきです。私たちは、次のリクエストに応じてそのクローンを返し、オブジェクトをキャッシュして、データベースを更新し、必要なときので、データベース呼び出しを削減することができます。
下の図の流れとコードとのプロトタイプデザインパターンのデモの例です。
ステップ1は、クローニング可能なインタフェースを実装する抽象クラスを作成します。
パブリック 抽象 クラスの形状は、実装のCloneable { プライベート文字列ID; 保護された文字列型。 抽象 ボイドドロー(); パブリック文字列のgetType(){ 戻り値のタイプ; } パブリック文字列のgetId(){ 戻りID。 } 公共 ボイドSETID(文字列ID){ この .ID = ID。 } パブリックオブジェクトクローン(){ オブジェクトクローン = NULL ; 試す{ クローン =スーパー.clone(); } キャッチ(CloneNotSupportedException電子){ e.printStackTrace(); } 戻りクローン; } }
上記のクラスを拡張した具体クラスを作成します。
1. Rectangle.java
パブリック クラス長方形は延び形{ パブリック矩形(){ タイプ =「矩形を」。 } @Override 公共 ボイドドロー(){ System.out.printlnは( "内部長方形:: draw()メソッド。" ); } }
2. Square.java
パブリック クラススクエア延び形{ 公共広場(){ タイプ =「スクエア」。 } @Override 公共 ボイドドロー(){ System.out.printlnは( "インサイド・スクエア:: draw()メソッド。" ); } }
3. Circle.java
パブリック クラスサークル延び形{ パブリックサークル(){ タイプ =「サークル」。 } @Override 公共 ボイドドロー(){ System.out.printlnは( "内部サークル:: draw()メソッド。" ); } }
ステップ3.データベースから具象クラスを取得し、ハッシュテーブルに格納するクラスを作成します。
インポートするjava.util.Hashtable; パブリック クラスShapeCache { プライベート 静的 HashtableのshapeMap = <文字列、図形> 新しいハッシュテーブル<文字列、図形> (); パブリック 静的形状getShape(文字列shapeId){ 形cachedShape = shapeMap.get(shapeId)。 リターン(形状)cachedShape.clone(); } // 各形状実行データベースクエリおよび形状作成 // shapeMap.put(shapeKey、形状)。 // 例えば、我々は3つの形追加されている 公共の 静的な 無効 = {)(loadCacheを サークルサークルの新しいサークル(); circle.setId( "1" )。 shapeMap.put(circle.getId()、円)。 スクエア広場 = 新スクエア(); square.setId( "2" ); shapeMap.put(square.getId()、四角)。 矩形矩形 = 新しい矩形()。 rectangle.setId( "3" )。 shapeMap.put(rectangle.getId()、矩形); } }
ステップ4 PrototypePatternDemoはHashtableに格納されている形状のクローンを得るためにShapeCacheクラスを使用しています。
PrototypePatternDemo.java
パブリック クラスPrototypePatternDemo { 公共 静的 ボイドメイン(文字列[]引数){ 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()); }