我在FactoryMethod和AbstractFactory上阅读了维基百科的文章,但以下代码似乎不适合任何地方。有人可以向我解释以下模式是什么,或者它是否是反模式?
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模式,但在阅读维基百科文章后,我有疑虑。
答案 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解释简单工厂,工厂方法和抽象工厂之间的区别。