Шаблон "фабричный метод" нарушает Открываться/Закрывать принцип?

Шаблон "фабричный метод" (чтобы не быть перепутанным с Шаблонами "фабрика" или Шаблонами "абстрактная фабрика") нарушают Открываться/Закрывать принцип?

Обновление: Для разъяснения я обращаюсь к сценарию, где реальный класс имеет статические методы фабрики для него. Например (это от страницы Wikipedia на 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) {
       //...
    }
}

Разве частный конструктор не препятствует тому, чтобы класс был разделен на подклассы, т.е. расширен?

Разве класс не должен был бы быть изменен для поддержки новых методов фабрики? Например, если бы класс первоначально только имел fromCartesian, и позже fromPolar был необходим, разве то класс не должен был быть изменен для поддержки этого?

Не оба из них нарушают, Открываются/Закрывают?

8
задан Todd Ropog 4 March 2010 в 19:06
поделиться

2 ответа

Нет, это вообще не нарушает принцип Открыто / Закрыто.

Открытый / Закрытый означает, что вы можете изменить способ работы системы, не изменяя уже существующий код. Вы можете расширять код и использовать его по-разному, но старый код все еще работает и не нуждается в повторном тестировании.

Шаблон фабричного метода создает объект другого типа на основе заданных параметров. Заводской метод действительно хорошо работает с принципом Открыто / Закрыто, если все сделано правильно. Однако, если вы создаете новый класс, а затем хотите, чтобы фабричный метод создавал новый объект этого типа, вам придется изменить фабричный метод.

Хотя, если бы у вас был какой-то файл конфигурации или что-то в этом роде, которое считывается фабричным методом, вам не нужно было бы изменять фабричный метод ... только файл конфигурации, который затем определяет, какой объект будет может быть создан фабричным методом.

4
ответ дан 5 December 2019 в 15:22
поделиться

Нет. Из вашей ссылки в Википедии:

программные объекты (классы, модули, функции и т. Д.) Должны быть открыты для расширения, но закрыты для модификации

Переопределение фабричного метода является расширением. Вы создаете новый класс. Вы не меняете существующий класс. Вы должны заменить (надеюсь, через конфигурацию вашего контейнера IoC) подкласс на оригинал.

2
ответ дан 5 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: