【发布时间】:2011-01-23 18:46:00
【问题描述】:
Factory Method pattern(不要与工厂或抽象工厂模式混淆)是否违反了Open/Closed principle?
更新: 为了澄清,我指的是具体类上有静态工厂方法的场景。例如(来自 FMP 上的 Wikipedia 页面):
class Complex
{
public static Complex fromCartesian(double real, double imag) {
return new Complex(real, imag);
}
public static Complex fromPolar(double modulus, double angle) {
return new Complex(modulus * cos(angle), modulus * sin(angle));
}
private Complex(double a, double b) {
//...
}
}
私有构造器不会阻止类被子类化,即扩展吗?
难道不需要修改类来支持新的工厂方法吗?例如,如果该类最初只有 fromCartesian,后来需要 fromPolar,那么是否必须修改该类以支持这一点?
这两个都不违反 Open/Closed 吗?
【问题讨论】:
-
在我回答之前,我想知道您对此有何看法。你的回答会让我觉得你在寻找答案。否则,就像您将工作外包给 SO。
-
抱歉,本来打算加个评论的,但是因为工作而跑题了。 :) 我认为它确实违反了它。如果我错了,请纠正我,但 FMP 规定私有构造函数,私有构造函数禁止扩展。此外,是否必须修改该类以支持替代实现?我正在考虑类具有静态工厂方法的情况。也许这只是 FMP 的一种风味?
-
难道switch语句还不需要修改类吗?私有构造函数阻止扩展的问题呢?
-
您引用的维基百科代码并不是真正的经典工厂方法模式。这很相似,但在我看来,这不是一回事。在需要工厂方法的情况下,您不会使用这样的代码。
-
那个特定的代码并不是真的,因为像数字这样的东西通常是一种特殊情况,并且创建它们的方式并不是您的要求所要求的可配置的。但是其他一些具有私有构造函数和静态工厂方法的类(包含可能更改的业务逻辑)?是的。
标签: design-patterns factory-method open-closed-principle