12

それで、私はデザインパターンについて読んでいますが、プロトタイプパターンは私を混乱させます。これを使用するポイントの 1 つは、 new演算子を使用する必要がなくなることだと思います。次に、この例を見てください。

http://source Making.com/design_patterns/prototype/java/1

まず、彼らのプロトタイプのアイデアは clone() メソッドを実装していますが、これは奇妙です。ウィキペディアには、サブクラスによって実装される純粋な仮想メソッドのクローンが必要であるとも書かれています (なぜですか?)。Java はすでにそのようなメソッドを提供しており、必要なことを正確に実行します (つまり、オブジェクトを最初からインスタンス化するのではなく、オブジェクトのコピーを作成します)。次に、clone メソッドは演算子new !を呼び出します。確かに例は間違っていますか?(その場合、別の場所でデザイン パターンを勉強する必要がありますね?)。この修正が正しいかどうか誰かが教えてくれますか?:

static class Tom implements Cloneable implements Xyz {
    public Xyz    cloan()    {
      return Tom.clone(); //instead of new I use clone() from Interface Cloneable
    }
    public String toString() {
      return "ttt";
    }
  } 

説明をいただければ幸いです。

4

5 に答える 5

10

プロトタイプ パターンのアイデアは、インスタンスを生成できる青写真/テンプレートを用意することです。「Java で new を使用することを避ける」だけではありません。

Java でプロトタイプ パターンを実装する場合は、必ずclone()Object クラスの既存のメソッドをオーバーライドします。新しいメソッドを作成する必要はありません。(Clonable インターフェースも実装する必要があります。そうしないと、例外が発生します)

例として:

// Student class implements Clonable
Student rookieStudentPrototype = new Student();
rookieStudentPrototype.setStatus("Rookie");
rookieStudentPrototype.setYear(1);

// By using prototype pattern here we don't need to re-set status and
// year, only the name. Status and year already copied by clone
Student tom = rookieStudentPrototype.clone();
tom.setName("Tom");

Student sarah = rookieStudentPrototype.clone();
sarah.setName("Sarah");
于 2013-06-20T00:39:44.373 に答える
4

設計パターンは、ソフトウェアが再現可能な方法でどのように記述されるかを表す方法にすぎません。実際には、同じことを達成するためのさまざまな構文アプローチがあります。

したがって、Prototype パターンは、マスター コピーを使用してオーバーライド機能を実装する単純なアプローチです。Java でこれを行うにはいくつかの方法があります (同様に、私は他の言語も信じています)。これは「new」キーワードを使用するもので、具体的なクラスを実装する契約としてインターフェイスを使用することに基づいています。次に、単一のメソッドがインターフェースの具体的な実装を取り、同じ操作を実行します。

// software contract
interface Shape { 
   public void draw();
} 
// concrete implementations
class Line implements Shape {
   public void draw() {
      System.out.println("line");
   }
}
class Square implements Shape {
   public void draw() {
      System.out.println("square");
   }
}
...
class Painting {
   public static void main (String[] args) {
      Shape s1 = new Line ();
      Shape s2 = new Square ();
      ...
      paint (s1);
      paint (s2);
      ...
   }
   // single method executes against the software contract as a prototype
   static void paint (Shape s) {
      s.draw ();
   }
}

詳細については、http://www.javacamp.org/designPattern/prototype.htmlを参照するか、デザイン パターンのメイン サイトをご覧ください。情報は、参照を含めて完全に表示されます。

于 2013-06-20T00:30:38.057 に答える
3

リンクした例は正しく、コードは

return Tom.clone();

clone()は静的メソッドではないため、コンパイルされません。

複製とは、演算子の使用を避けることではなく、new複製されるオブジェクトと同じ状態 (メンバー フィールドの値) を持つ新しいインスタンスを作成することです。したがって、clone()静的ではなくインスタンス メソッドであるため、呼び出されたオブジェクトの状態を反映する新しいインスタンスを作成できます ( newを使用しても問題ありません)。clone()

サンプル クラス (Tom など) が非常に単純で (状態がない)、clone()メソッドが行っていることは新しいインスタンスをインスタンス化することだけです。もう少し複雑な状態 (ArrayListオブジェクトの など) がある場合、clone()メソッドは のディープ コピーも行う必要がありArrayListます。

サンプル クラスの 1 つを詳しく説明するには、インスタンス stateTomがあると仮定します。ここで、返されるコピーが現在の状態と一致することも確認する必要があります。clone()

static class Tom implements Xyz {

    private String name;

    public Tom() {
      this.name = "Tom"; // some state
    }

    public Xyz clone()    {
      Tom t = new Tom();
      t.setName(getName()); // copy current state
      return t;
    }

   public String toString() {
      return getName();
    }

   public String getName() {
      return name;
    }

   public void setName(String name) {
      this.name = name;
    }
}
于 2013-06-20T00:40:05.510 に答える