ホームページ  >  記事  >  Java  >  Javaデザインパターンにおけるプロトタイプパターンの具体的な分析

Javaデザインパターンにおけるプロトタイプパターンの具体的な分析

黄舟
黄舟オリジナル
2017-08-11 10:00:121229ブラウズ

この記事では、編集者が非常に良いと思ったデザインパターンのプロトタイプモードを中心に紹介しますので、参考にしてください。エディターに従って見てみましょう

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

タイプ: クラスパターンの作成

クラス図:

プロトタイプパターンは、主にクラス図内のプロトタイプクラス Prototype をコピーするために使用されます。 Prototype クラスは、次の 2 つの条件を満たす必要があります:

  • Cloneable インターフェイスを実装する。 Java 言語には Cloneable インターフェイスがあり、その機能は 1 つだけです。このインターフェイスを実装するクラスで clone メソッドを安全に使用できることを実行時に仮想マシンに通知します。 Java 仮想マシンでは、このインターフェイスを実装するクラスのみをコピーできます。コピーできない場合は、実行時に CloneNotSupportedException がスローされます。

  • Object クラスの clone メソッドをオーバーライドします。 Java では、すべてのクラスの親クラスは Object クラスです。Object クラスには、オブジェクトのコピーを返すために使用される clone メソッドがあります。そのため、そのスコープは保護されており、通常のクラスでは呼び出すことができません。 、Prototype クラスをクローンする必要があります。メソッドのスコープはパブリック型に変更されます。

プロトタイプパターンは比較的シンプルなパターンで、インターフェースを実装してメソッドを書き換えるだけでプロトタイプパターンが完成します。実際のアプリケーションでは、プロトタイプのパターンが単独で現れることはほとんどありません。彼のプロトタイプ クラス Prototype は、他のパターンと混合されることが多く、抽象クラスに置き換えられることがよくあります。

実装コード:


class Prototype implements Cloneable { 
  public Prototype clone(){ 
    Prototype prototype = null; 
    try{ 
      prototype = (Prototype)superclone(); 
    }catch(CloneNotSupportedException e){ 
      e.printStackTrace(); 
    } 
    return prototype;  
  } 
} 
 
class ConcretePrototype extends Prototype{ 
  public void show(){ 
    System.out.println("原型模式实现类"); 
  } 
} 
 
public class Client { 
  public static void main(String[] args){ 
    ConcretePrototype cp = new ConcretePrototype(); 
    for(int i=0; i< 10; i++){ 
      ConcretePrototype clonecp = (ConcretePrototype)cpclone(); 
      clonecp.show(); 
    } 
  } 
}

プロトタイプモードの利点と適用可能なシナリオ

プロトタイプモードを使用してオブジェクトを作成すると、Object クラスの clone メソッドが使用されるため、オブジェクトを直接新規作成するよりもパフォーマンスが大幅に向上します。はローカル メソッドであり、メモリ内のバイナリ ストリームを直接操作します。特に大きなオブジェクトをコピーする場合、パフォーマンスの違いは非常に明白です。

プロトタイプ パターンを使用するもう 1 つの利点は、オブジェクトの作成が簡素化され、ドキュメントの編集時にコピーして貼り付けるのと同じくらい簡単にオブジェクトを作成できることです。

上記の利点があるため、同様のオブジェクトを繰り返し作成する必要がある場合は、プロトタイプ パターンの使用を検討できます。たとえば、ループ本体内でオブジェクトを作成する必要がある場合、オブジェクト作成プロセスが複雑であるかループが多い場合、プロトタイプ パターンを使用すると、作成プロセスが簡素化されるだけでなく、システム全体のパフォーマンスも向上します。多く。

プロトタイプパターンに関する注意事項

  • プロトタイプパターンを使用してオブジェクトをコピーしても、クラスのコンストラクターは呼び出されません。オブジェクトのコピーはObjectクラスのcloneメソッドを呼び出すことで完了するため、データをメモリ上に直接コピーするため、クラスのコンストラクタは呼び出されません。プロトタイプモードでは、コンストラクター内のコードが実行されないだけでなく、アクセス権限も無効になります。シングルトンパターンを覚えていますか?シングルトンモードでは、コンストラクターのアクセス権限をプライベートに設定していればシングルトンを実装できます。ただし、clone メソッドはコンストラクター メソッドの権限を直接無視するため、シングルトン モードはプロトタイプ モードと競合するため、使用する場合は特に注意が必要です。

  • 深いコピーと浅いコピー。 Object クラスの clone メソッドは、オブジェクト内の基本的なデータ型のみをコピーします。これは、浅いコピーではありません。ディープコピーを実装したい場合は、プロトタイプモードで配列、コンテナオブジェクト、参照オブジェクトなどを別途コピーする必要があります。例:


public class Prototype implements Cloneable { 
  private ArrayList list = new ArrayList(); 
  public Prototype clone(){ 
    Prototype prototype = null; 
    try{ 
      prototype = (Prototype)superclone(); 
      prototype.list = (ArrayList) this.list.clone(); 
    }catch(CloneNotSupportedException e){ 
      e.printStackTrace(); 
    } 
    return prototype;  
  } 
}

ArrayList は基本型ではないため、メンバー変数リストはコピーされず、ディープ コピーを自分で実装する必要があります。幸いなことに、Java が提供するほとんどのコンテナ クラスは Cloneable を実装しています。インターフェース。したがって、ディープコピーの実装は特に難しいことではありません。

以上がJavaデザインパターンにおけるプロトタイプパターンの具体的な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。