Шаблон Factory не является нарушителем OCP.
Это зависит от того, как вы продвинете поведение Complex
дальше.
Если Complex
требуется для поддержки создания новых типов Complex
объектов, и вы решили изменить Complex
, добавив новые fromX
методы, добавленные для их поддержки, то это означает, что Complex
становится нарушителем OCP, потому что Complex
необходимо повторно открыть для изменения:
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));
}
//class opened for modification
public static Complex fromOtherMeans(String x , String y) {
return new Complex(x, y);
}
}
Вы можете передать эту проблему в текстовый файл или какой-либо файл свойств, чтобы избавить себя от необходимости изменять класс java, но это не мешает вам писать дополнительную логику в этой области решения, чтобы для поддержки новых типов Complex
.
В зависимости от использования Complex
в вашем дизайне (чем отличаются различные типы? Как вы их используете?), Есть несколько альтернативных вариантов, которые могут быть хорошо применимы.
Одна из таких OCP дружественной альтернативы - подкласс Complex
для предоставления дополнительных заводских методов. Подкласс - это простейшая иллюстрация того, как Complex
расширяется, но не изменяется.
Другой дружественной OCP альтернативы изменению Complex
в этом случае является Шаблон декоратора. Постоянное украшение Complex
возможностью создания новых вариантов Complex
уважает OCP, потому что Complex
не изменяется, а расширяется за счет добавления новых функций.
Третьей альтернативой может быть изменение структуры Complex
так, чтобы его вычисление осуществлялось композицией. Это откроет вам возможность использовать шаблон стратегии, чтобы различать различные варианты поведения Complex
.
Особенность шаблона Factory в том, что он помогает контекстному коду уважать OCP. Чтобы оставаться на правой стороне OCP со своими Factory, но ваши коллеги, скорее всего, взглянут на граф объектов, усомнятся в целесообразности наличия графа объектов над одной Factory и упростят его до одной Factory, что вернет вас к первому примеру.
В таких случаях вместо того, чтобы пытаться изменить вашу реализацию шаблона Factory для соблюдения SOLID, подумайте, почему вы его используете вообще.
person
8bitjunkie
schedule
24.06.2014