Нарушает ли шаблон проектирования Abstract factory принцип открытия/закрытия?

Предположим, мы хотим создать кнопку и текстовую область.

Мы можем создать их для Windows или Mac.

Как я понял, есть два оператора switch или if, один для выбора нужной фабрики, а другой для выбора нужного продукта.

Но если я хочу добавить фабрику Linux и продукт текстового поля, должен ли я отредактировать код и добавить эту третью опцию в операторы if или switch?

Не нарушает ли это принцип открытия/закрытия?


person Hamed Homaee    schedule 18.03.2021    source источник


Ответы (1)


В абстрактной фабрике нет операторов switch или if; однако существует огромное количество дезинформации о фабричных шаблонах, поэтому недоразумения распространены. В чем разница между шаблонами проектирования Abstract Factory и Factory? может помочь в этом отношении.

Тем не менее, паттерн Абстрактная фабрика по-прежнему подвержен нарушениям OCP, потому что, как вы заметили, не существует очевидного способа добавления новых продуктов. Книга GoF устраняет это ограничение и предлагает потенциальное решение. См.: Есть ли более реальный пример шаблона Abstract Factory?

person jaco0646    schedule 18.03.2021
comment
Спасибо за ваш ответ. Я проверил ссылки, которые вы прислали, но проблема для меня в том, что, похоже, никто не использовал эти реализации AF в функции main. Я реализовал AF, используя операторы switch, а в функции main я создал кнопку следующим образом: Button uiElement =(Button)UiFactory.CreateUiFactory("Windows").CreateUiElement("Button"); Но теперь я думаю, что AF создает интерфейс только для того, чтобы диктовать другим фабрикам, какие требования они должны выполнять, например, все фабрики пользовательского интерфейса должны создавать кнопку и текстовое поле. в моем примере. Я прав? - person Hamed Homaee; 19.03.2021
comment
В этом случае я бы сказал, что вы (и другие) реализовали не шаблон Abstract Factory; и ответ на вопрос Разве это не нарушает принцип открытия/закрытия? просто да. Лучшие описания и примеры паттерна находятся в первой связанной ветке выше. Вы правы в том, что это интерфейс для определения сопутствующих товаров. - person jaco0646; 19.03.2021