ついにいくつかの基本的なパターンを真剣に学ぼうとし始めました(キャリアの非常に遅い時期ですが、それは別の話です)。ファクトリパターンと抽象ファクトリの違いに注意してください。

これら2つのパターンの主な違いは何ですか?

ファクトリメソッドは継承によってオブジェクトを作成し、抽象ファクトリはオブジェクト構成によるものですが、実用的な観点からは、それぞれがどのように機能するかを正確に視覚化するのにまだ問題があります。

コメント

ファクトリメソッド"と言うとき"ファクトリパターン"?Gang of Fourパターンについて話している場合、ファクトリパターンはありませんが、抽象要素はありますyとファクトリメソッド。

  • はい-ファクトリメソッド。
  • 公平を期すために、2つのフレーズはかなり一般的に交換されているようです。
  • ああ、ファクトリメソッド。 newが' taメソッドではないという事実の回避策(一部の–確かに一般的な–オブジェクトシステム)
  • 回答

    ファクトリメソッドは通常、switchステートメントによって分類され、各ケースは同じルートインターフェイスを使用して異なるクラスを返すため、呼び出し元のコードが実装について決定する必要はありません。

    クレジットカード検証ファクトリを考えてみてください。カードタイプごとに異なるバリデータを返します。

    public ICardValidator GetCardValidator (string cardType) { switch (cardType.ToLower()) { case "visa": return new VisaCardValidator(); case "mastercard": case "ecmc": return new MastercardValidator(); default: throw new CreditCardTypeException("Do not recognise this type"); } } 

    抽象ファクトリは、1つのインターフェイスから派生した複数の具体的なファクトリクラス(ファクトリメソッドではない)があり、さまざまなメソッドからさまざまなタイプを返す可能性があります。

    異なるクラスのチェスゲームマネージャーを考えてみてください。バリアントルールのセットごとに。

    public class StandardChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new StandardChessBoardMapper(); } public IKingMover GetKingMover() { return new StandardChessKingMover(); } public IMoveClock GetMoveClock() { return new StandardMoveClock(); } } public class HexagonalChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new HexagonalChessBoardMapper(); } public IKingMover GetKingMover() { return new HexagonalChessKingMover(); } public IMoveClock GetMoveClock() { return new StandardMoveClock(); } } public class SpeedChessRulesFactory : IChessRulesFactory { public IBoardMapper GetBoardMapper() { return new StandardChessBoardMapper(); } public IKingMover GetKingMover() { return new StandardChessKingMover(); } public IMoveClock GetMoveClock() { return new SpeedChessMoveClock(); } } 

    抽象ファクトリは、ストラテジーと同様に、ファクトリメソッドを使用して多くの場合選択されますが、それらを組み合わせる必要はないため、独自のパターンになります。

    コメント

    • ファクトリメソッドの説明は正しいですか? 'の"ファクトリメソッドパターンは、オブジェクトの作成がサブクラスに委任されるため、継承に依存しています。オブジェクトを作成するファクトリメソッドを実装します"。したがって、この例は静的ファクトリに似ています。
    • @SerGええと、公平を期すために、'ウィキペディアからその引用をピックアップしました。 3年前とは異なります。現在のウィキペディアのページはいくつかの場所で矛盾していると私は主張しますが、'それをバラバラにすることに関与したいとは思っていません。後から考えると、ここで提供した'の例は、パラメータ化されたファクトリメソッドと呼ばれる特定の種類のファクトリメソッドであると認めます。ただし、ファクトリメソッドと抽象ファクトリの違いについてのポイントは、すべてのタイプのファクトリメソッドに当てはまります。
    • 私の引用と同じステートメントが存在します。 GoF "デザインパターン"で。また、パラメータ化されたFMについても説明されています。
    • 重要な部分は、特定の状況に応じて、ファクトリが呼び出し元に適切なオブジェクトを提供し、呼び出し元が'そのオブジェクトのクラスを正確に知る必要はなく、'オブジェクトがそのオブジェクトのインターフェイスをサポートしている限り、特定のオブジェクトがどのように選択されたかを知る必要はありません。発信者は知っています。
    • あなたの例は典型的なファクトリメソッドパターンではなく、パラメータ化されたファクトリメソッドという名前の特殊化であることを回答で明確に述べる必要があります。そして、典型的なファクトリメソッドの定義について書いてください。ファクトリメソッドパターンについて学んでいたところ、すべてを理解した後、ファクトリメソッドパターンを別のものとして示している回答を読んで混乱しました。その例が典型的なファクトリメソッドパターンではないという情報はありません。コメントでそれを指摘してくれたSerGに感謝します。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です