Factory Method pattern(不要與工廠或抽象工廠模式混淆)是否違反了Open/Closed principle?工廠方法模式是否違反開放/關閉原則?
更新: 爲了澄清,我指的是具體類具有靜態工廠方法的場景。例如(這是從維基百科頁面上FMP):
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) {
//...
}
}
不私有構造函數阻止類被子類,即延長?
是不是要修改這個類來支持新的工廠方法?例如,如果班級最初只來自笛卡兒,後來需要來自太陽隊,那麼班級是不是必須修改才能支持這一點?
這兩個都不違反開放/關閉?
我想在回答之前知道您對此的看法。你的回答會讓我覺得你正在尋找答案。否則,就像你正在將你的工作外包給SO一樣。 – 2010-03-04 17:13:06
對不起,正計劃添加一條評論,但因工作而偏離了原路。 :) 我在想這確實違反了它。如果我錯了,請糾正我,但FMP指定一個私有構造函數,而私有構造函數禁止擴展。另外,是否不需要修改類以支持其他實現?我正在考慮一個類有靜態工廠方法的情況。也許這只是FMP的一種味道? – 2010-03-04 17:55:14
如果它是一個子類,那麼你可以覆蓋該方法或使用super()(假設Java)。你最好不要使用靜態方法,並且有一個方法需要使用switch語句或通過讀取提供的配置文件來獲取參數。 – 2010-03-04 19:20:39