3

FactoryMethodAbstractFactoryに関するウィキペディアの記事を読みましたが、次のコードはどこにも当てはまらないようです。誰かが次のパターンが何であるか、またはそれがアンチパターンであるかどうかを説明できますか?

interace PaymentGateway{
  void makePayment();
}

class PaypalPaymentGateway implements PaymentGateway
{
  public void makePayment()
  {
    //some implementation
  }
}


class AuthorizeNetPaymentGateway implements PaymentGateway
{
  public void makePayment()
  {
    //some implementation
  }
}

class PaymentGatewayFactory{
  PaymentGateway createPaymentGateway(int gatewayId)
  {
    if(gatewayId == 1)
      return PaypalPaymentGateway();
    else if(gatewayId == 2)
      return AuthorizeNetPaymentGateway();
  }
}

ユーザーが HTML ページのラジオ ボタンを使用して支払い方法を選択し、gatewayId がラジオ ボタンの値から派生するとします。

私はこのようなコードを見て、AbstractFactory パターンだと思っていましたが、ウィキペディアの記事を読んだ後、疑問を抱いています。

4

3 に答える 3

1

これは、ファクトリ パターン、抽象ファクトリ パターン、またはビルダー パターンではありません。それらには特定の意図があり、コードと一致するものはありません。

しかし、一部の人が示唆しているように、インターフェイス PaymentGateway と具象クラスは戦略パターンを実装します。戦略パターンの意図は完全に一致します。「アルゴリズムのファミリーを定義し、それぞれをカプセル化し、それらを交換可能にします。戦略により、アルゴリズムは、それを使用するクライアントとは独立して変化します。」

戦略パターンは、必ずしもオンザフライで動作を変更する必要はありません。これは、クライアント コード (戦略パターンの抽象化を使用するコード) に依存します。

PaymentGatewayFacotry はどの GoF パターンとも一致しません。ファクトリ パターン、抽象ファクトリ パターン、またはビルダー パターンの意図と一致しません。Lorenzo が提案したように、パラメータ化されたファクトリまたはパラメータ化されたセレクターと呼ぶことができます。ただし、これは正しくコーディングされていないクラスです。開閉原理に反します。

于 2014-06-04T18:22:36.973 に答える