这个设计模式是什么?

时间:2014-06-04 08:25:36

标签: java design-patterns abstract-factory factory-method

我在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模式,但在阅读维基百科文章后,我有疑虑。

3 个答案:

答案 0 :(得分:2)

网关类实现a strategy pattern,其选择委托给我称之为参数化工厂。

如果你想把它减少到其中一个GOF模式我会说它更像是builder pattern,缩写为速记调用而不是设置策略并随后调用build()。

如果您想扩展到Fowler模式,可以将其与Registry

进行比较

答案 1 :(得分:1)

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

但正如一些人所说,接口PaymentGateway和具体类实现了策略模式。策略模式的意图完全匹配:"定义一系列算法,封装每个算法,并使它们可互换。策略允许算法独立于使用它的客户端。"

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

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

答案 2 :(得分:1)

在Craig Larman的书"Applying UML and Patterns"(第26.4节)中,他将此称为"简单工厂"或"混凝土厂"并说它不是GoF模式,但是非常普遍。

"Head First Design Patterns"也为这种模式投入了空间:

  

Simple Factory实际上并不是一种设计模式;它更像是一种编程习语。但它是常用的,所以我们将给它一个首要模式荣誉奖。有些开发人员把这个成语误认为是“工厂模式”,所以下次你和另一个开发人员之间存在尴尬的沉默时,你有一个很好的话题来打破僵局。

     

弗里曼,埃里克;罗布森,伊丽莎白;贝茨,伯特;塞拉,凯西(2004-10-25)。首先设计模式(Kindle位置1920-1923)。 O' Reilly Media。 Kindle版。

[编辑]我喜欢这个blog entry解释简单工厂,工厂方法和抽象工厂之间的区别。