Я исследовал этот самый момент и наткнулся на этот вопрос, но не чувствовал, что на него ответили полностью. Тем не менее, я нашел эту удобную статью - Обновление рекомендаций по проектированию: фабрики против конструкторов - Кшиштофа Квалина (главный архитектор в .NET Framework). Стоит прочитать всю статью, но вот краткое изложение основных моментов:
Наиболее распространенным и последовательным способом создания экземпляра типа является
через его конструктор. Однако иногда предпочтительной альтернативой является
используйте шаблон Factory.
Предпочитаю конструкторов, а не фабрики, как правило, они больше
последовательный и удобный, чем специализированные строительные механизмы.
Реализуйте фабричные операции как методы, а не свойства.
Возвращать экземпляры как возвращаемые значения метода, а не как параметры out.
Рассмотрите возможность использования Фабрики, если вам нужен больший контроль над созданием
образцы экземпляров.
Подумайте о присвоении имен методам Factory, объединив «Create» и имя
создаваемого типа.
Подумайте о присвоении имен фабричным типам, объединив имя типа
создал и «Фабрику».
Не реализуйте свою Фабрику статическим методом, если
строительная операция должна быть доступна для подклассов, чтобы специализироваться.
Использовать фабрику для операций в стиле преобразования.
Использовать Factory, если для операции требуется информация о параметрах, которая
неестественно переходить к конструктору.
Не используйте Фабрику в ситуациях, когда операция создания будет
использоваться в качестве основного сценария для создания экземпляра типа. В этих
ситуации, обнаруживаемость и последовательность имеют первостепенное значение.
Подумайте об использовании конструктора вместо фабрики. Только после этого
мыслительный процесс, если вы приступите к реализации
Factory.
Фабрики также часто удобны для включения специализации типов через
полиморфизм.
Используйте фабрику, если пользователи API будут кодировать базовый класс или
интерфейс, реализация которого может изменяться со временем.
Используйте фабричные методы в тех случаях, когда разработчик может не знать, какой
тип для построения, например, при кодировании против базового типа или
интерфейс.
Реализуйте фабричные операции как методы виртуальных экземпляров.
чем статические, если они должны поддерживать полиморфное расширение.
Используйте шаблон Singleton для фабрик, основанных на экземплярах, так
а не заставлять разработчиков создавать экземпляры типа Factory только для
вызвать одного из его членов.
Используйте метод Factory, если конструктор будет недостаточным для
опишите выполняемую операцию и дополнительную информацию
полученный от индивидуально названной фабрики делает цель операции
понятнее.