Мне нравится идея «программировать интерфейсы» и избегать использования ключевого слова «new».
Однако что мне делать, если у меня есть два класса с одинаковым интерфейсом, но принципиально разные в настройке. Не вдаваясь в подробности моего конкретного кода, у меня есть интерфейс с методом «DoStuff». Этот интерфейс реализуют два класса. Один из них очень прост и не требует никакой инициализации. Другой имеет пять различных переменных, которые необходимо настроить. В сочетании они позволяют классу работать буквально миллионами способов при вызове DoStuff.
Так когда же мне «новые» эти классы? Я думал об использовании фабрик, но я не думаю, что они подходят в этом случае из-за огромной разницы в настройке. (Кстати: на самом деле существует около десяти различных классов, использующих интерфейс, каждый из которых позволяет формировать часть сложного конвейера и каждый с различными требованиями к конфигурации).