3

我阅读了有关FactoryMethodAbstractFactory的 Wikipedia 文章,但以下代码似乎不适用于任何地方。有人可以向我解释以下模式是什么,或者它是否是反模式?

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 模式,但在阅读了 Wikipedia 文章后,我有疑问。

4

3 回答 3

2

网关类实现了一种策略模式,其中选择委托给我所谓的参数化工厂。

如果您想将其简化为 GOF 模式之一,我会说它更像是一种builder 模式,浓缩为简写调用,而不是设置策略并在之后调用 build()。

如果您想扩展到 Fowler 模式,可以将其与注册表进行比较

于 2014-06-04T08:38:42.020 回答
1

在 Craig Larman 的书“应用 UML 和模式”(第 26.4 节)中,他将其称为“简单工厂”或“具体工厂”,并表示这不是 GoF 模式,但非常普遍。

“Head First Design Patterns”也为这个模式留出了篇幅:

简单工厂实际上并不是一种设计模式。它更像是一种编程习惯。但它是常用的,所以我们将给它一个 Head First Pattern Honorable Mention。一些开发人员确实把这个成语误认为是“工厂模式”,所以下次你和另一个开发人员之间出现尴尬的沉默时,你就有了一个很好的话题来打破僵局。

弗里曼,埃里克;罗布森,伊丽莎白;贝茨,伯特;凯西塞拉 (2004-10-25)。Head First 设计模式(Kindle Locations 1920-1923)。奥莱利媒体。Kindle版。

[编辑] 我喜欢这篇解释简单工厂、工厂方法和抽象工厂之间区别的博文。

于 2014-06-05T01:43:41.843 回答
1

这不是工厂模式,抽象工厂模式或构建器模式。它们有特定的意图,并且与代码不匹配。

但正如一些人所建议的,接口 PaymentGateway 和具体类实现了策略模式。策略模式的意图完美匹配:“定义一系列算法,封装每个算法,并使它们可互换。策略让算法独立于使用它的客户而变化。”

策略模式不一定要具有动态的行为变化。它取决于客户端代码(使用策略模式抽象的代码)。

PaymentGatewayFacotry 与任何 GoF 模式都不匹配。它与工厂模式、抽象工厂模式或构建器模式的意图不匹配。正如 Lorenzo 所建议的,您可以将其称为参数化工厂或参数化选择器。虽然这是一个编码错误的类。它违反了开闭原则。

于 2014-06-04T18:22:36.973 回答