Цитата (twin @ 1.09.2017 - 06:06) |
Ты продолжаешь разочаровывать. Не пытайся запутать тем, что рассматриваешь логику не с той стороны. Фабричный метод, это следствие. Начинать нужно с SimpleFactory Цитата (Santehnick @ 1.09.2017 - 00:15) | Верно, фабричный метод используют тогда когда процесс создания объекта несколько сложнее, чем обычный вызов конструктора. Иначе в этом паттерне нет смысла. |
Еще раз. Если нужен один объект, процесс создания которого сложнее, чем вызов конструктора, который может использовать другие объекты или пошаговую инициализацию свойств в процессе создания, используется "Строитель". Билдер. Builder. Фабрика потому и называется фабрикой, что призвана производить на свет множество однотипных объектов. Глупо строить фабрику молотков, если нужен всего один молоток. Глупо строить фабрику для производства телевизоров (хотя его создание достаточно сложно), если нужен один телевизор. И для производства штучных автомобилей глупо строить фабрику. В паттерне есть смысл только тогда, когда нужно упорядочить создание кучи объектов. Однотипных.
Вот фабрика может пользоваться билдерами, если логика такова, как ты описал, для:
Цитата (Santehnick @ 31.08.2017 - 10:25) | создания объекта автомобиля, который состоит из объекта двигателя, объекта руля, объекта колес и так далее, которые в свою очередь также могут быть составными. |
Только не "ля", а "лей". Автомобилей.
Вот это ты верно описал:
Цитата | Видим, что это дальнейшее развитие идеи фабричного метода. Теперь клиенту нужен не один объект, а целое семейство объектов. Например клиенту нужны объекты графического интерфейса, такие как Button (кнопка), Window (окно) и так далее. Мы знаем, что в Linux, Mac OS и Windows все эти объекты присутствуют, но имеют разную реализацию. Мы создаем AbstactButton, LinuxButton, MacOSButton, ButtonWindows, AbstractWindow, LinuxWindow, MacOSWindow, WindowWindows и фабрики AbstractGUIFactory, LinuxGUIFactory, MacOSGUIFactory, WindowsGUIFactory с методами createButton и createWindow. Каждая из реализаций абстрактной фабрики создает свою конкретную кнопку и своё окно. Клиент работает с AbstractGUIFactory и ему без разницы, какая реализация фабрики придет ему на вход LinuxGUIFactory, MacOSGUIFactory или WindowsGUIFactory он будет правильно работать с любой, так как зависит от AbstractGUIFactory, а не от её конкретной реализации. |
Но опять же только тогда, когда нужно много однотипных кнопок и окон. |
Неверно. Это нужно, чтобы сменить графический интерфейс с Windows на Linux не меняя код клиента, а не чтобы создавать однотипные кнопки/окна. Абстрактная фабрика здесь позволяет избавить клиента от знания о конкретном графическом интерфейсе win/mac/lin. Вместо этого, клиент знает только то, что есть некий абстрактный графический интерфейс. Затем в рантайме клиенту подается любая реализация графического интерфейса в зависимости от его операционной системы и всё работает. Если появляется необходимость в поддержке еще одной ОС, мы пишем ещё одну реализацию абстрактного графического интерфейса, без необходимости изменения клиентского кода. Это похоже на стратегию, но абстрактная фабрика позволяет создать и заменить целую группу объектов, в то время как стратегия только один.
Также если из UML диаграммы шаблона Factory method убрать правую часть с Creator, то получится шаблон стратегия.
Поэтому использовать Factory method следует когда нужно скрыть сложность инстанциирования объекта. Иначе нет смысла. Как я уже писал.
Про декоратор тебе chee и ron правильно говорят. Декоратор и декорируемый объекты должны зависеть от одного интерфейса. Таким образом, любой объект реализующий этот интерфейс может быть декорирован теми же самыми декораторами. В твоем же примере, если создать новый объект example2 и применить к нему декоратор twinorator, то чуда не произойдет, потому что последний явно зависит от объекта example, вместо того, чтобы зависеть от интерфейса exInterface. Чувствуешь разницу?
Парень с хекслета на которого ты ссылаешься, не смог правильно решить задачу, которую сам же и дал интервьюируемому. Если интересно, можешь поискать на его канале, там была задача про нахождение угла между часовой и минутной стрелками. В общем, это не лучший пример для отсылок. Парень просто делает деньги на тех, кто хочет войти в мир айти.