定義:プロトタイプインスタンスを使用して、作成するオブジェクトのタイプを指定し、これらのプロトタイプをコピーして新しいオブジェクトを作成します。
タイプ:クラスパターンを作成します
クラス図:
プロトタイプパターンは主にオブジェクトのコピーに使用され、そのコアはクラス図のプロトタイプクラスのプロトタイプです。プロトタイプのクラスは、次の2つの条件を満たす必要があります。
クローン可能なインターフェイスを実装します。 Java言語にはクローン可能なインターフェイスがありますが、これには1つの関数のみがあります。これは、このインターフェイスを実装するクラスでクローンメソッドを安全に使用できる実行時に仮想マシンに通知することです。 Java仮想マシンでは、このインターフェイスを実装するクラスのみをコピーできます。そうしないと、CloneNotsupportedExceptionが実行時にスローされます。
オブジェクトクラスのクローンメソッドを書き直します。 Javaでは、すべてのクラスの親クラスはオブジェクトクラスです。オブジェクトクラスにはクローンメソッドがあり、オブジェクトのコピーを返しますが、そのスコープは保護されたタイプであり、一般的なクラスを呼び出すことはできません。したがって、プロトタイプクラスは、クローン法の範囲をパブリックタイプに変更する必要があります。
プロトタイプモードは比較的単純なモードであり、非常に理解しやすいです。インターフェイスを実装してメソッドを書き直すために、プロトタイプモードが完了します。実際のアプリケーションでは、プロトタイプパターンが単独で表示されることはめったにありません。多くの場合、他のパターンと混合され、そのプロトタイプクラスのプロトタイプも抽象クラスに置き換えられます。
実装コード:
パッケージprototypepattern;パブリッククラスのprototypeclassはcloneable {@override Protected prototypeclass clone(){prototypeclass prototypeclass = null; try {prototypeclass =(prototypeclass)super.clone(); } catch(clonenotsupportedexception e){// todo auto-enerated catch block e.printstacktrace(); } return prototypeClass; }}クライアント:
パッケージprototypepattern; public class client {public static void main(string [] args){prototypeclass obj1 = new prototypeclass(); prototypeclass obj2 = obj1.clone(); System.out.println(obj1); System.out.println(obj2); }}プロトタイプモードと適用可能なシナリオの利点
オブジェクトクラスのクローンメソッドは、特に大きなオブジェクトをコピーする場合、パフォーマンスの違いは非常に明白であるため、オブジェクトクラスのクローンメソッドはメモリ内で直接操作するローカルメソッドであるため、プロトタイプモードを使用してオブジェクトを作成することははるかに優れています。
プロトタイプパターンを使用するもう1つの利点は、オブジェクトの作成を簡素化し、ドキュメントを編集するときにコピーパステのように簡単なオブジェクトを作成することです。
上記の利点があるため、同様のオブジェクトを繰り返し作成する必要がある場合は、プロトタイプパターンを使用することを検討できます。たとえば、ループ本体にオブジェクトを作成する必要があります。オブジェクトの作成プロセスがより複雑になっている場合、またはサイクルの数が多い場合、プロトタイプモードを使用すると、作成プロセスを簡素化するだけでなく、システムの全体的なパフォーマンスを大幅に向上させることもできます。
パブリッククラスのプロトタイプは、cloneable {private arraylist list = new ArrayList(); public Prototype clone(){prototype prototype = null; try {prototype =(prototype)super.clone(); prototype.list =(arraylist)this.list.clone(); } catch(clonenotsupportedexception e){e.printstacktrace(); } prototypeを返します。 }}プロトタイプモードに関するメモ:
ArrayListは基本的なタイプではないため、メンバー変数リストはコピーされず、自分でディープコピーを実装する必要があります。幸いなことに、Javaが提供するコンテナクラスのほとんどは、クローン可能なインターフェイスを実装しています。したがって、深いコピーを達成することは特に難しくありません。
PS:ディープコピーと浅いコピーの問題では、8 Javaとそのカプセル化タイプの基本タイプを含むディープコピーが発生し、文字列タイプもあります。残りは浅いコピーです。