Как правило, фабрики полезны, когда:
- вам нужны разные реализации интерфейса, основанные на определенных критериях
- конструкция объекта сложна, и вы не хотите распространять это повсюду и вместо этого локализовать его только в одном месте.
Пример 1:
В вашем случае код клиента просто скажет
Product p = Creator.create(Some_Critera);
В этом случае у вас просто есть продукт. Фабрика выясняет, какая реализация на основе критериев.
Пример 2:
Допустим, продукту нужно ввести 3 разных объекта. В этом случае каждое место, где вы делаете:
new SomeFancyProduct(dep1, dep2, dep3);
Вы подвергаетесь дублированию способа создания объекта. Конечно, используя IDE, вы можете легко сделать сигнатуру метода изменения и покончить с ней всякий раз, когда это нужно изменить.
Однако каждый клиент должен иметь dep1 , dep2 и т. Д. Всякий раз, когда ему требуется SomeFancyProduct . Вместо этого только Creator может зависеть от этих 3 объектов, и клиенты могут быть независимыми, поэтому не имеют никакой связи между клиентами и dep1 , dep2 и т. Д. .