Не поблочное тестирование достаточно. Действительно трудно вымыться и осуществить рефакторинг код, если у Вас нет модульных тестов. И без постоянного рефакторинга и очистки, гниль кода начинает начинаться и распространяться.
Используя шаблон "одиночка" для совместного использования объектов, как + [MyObject defaultObject]. Это - по существу глобальная переменная, которая делает для некоторых хороших скрытых зависимостей и связи. Это, в свою очередь, делает код тяжелее для тестирования.
Если вы хотите иметь более слабую связь, тогда завод имеет больше смысла, так как тогда вы можете просто позвонить на завод по производству автомобилей, передать перечисление suv и возвращается правильный класс. Ваше приложение не заботится о том, какой класс был фактически возвращен, если он соответствует вашим потребностям.
Если вы выполняете Внедрение зависимостей , но вам нужно создать экземпляры зависимости по мере необходимости внутри зависимого, один из вариантов - внедрить интерфейс в фабрику классов. Фабрика может возвращать интерфейс или абстрактный класс. Это обеспечивает гибкость, тестируемость,
Я использую фабрику, когда хочу, чтобы фабрика построила один из нескольких различных возможных подклассов (и я хочу, чтобы вызывающий знал о базовом классе, но не знал о подклассах).
Кроме того, иногда я буду использовать статические методы класса вместо перегруженного конструктора, когда разные статические методы принимают одни и те же типы параметров (и поэтому конструкторы не могут быть перегружены на основе одного типа параметра). Вот надуманный пример:
Department
{
//static factory methods
public static Department createFromBoss(string bossName) { ... }
public static Department createFromLocation(string locationName) { ... }
}
I disagree with his statement. Different constructor are used when you have different methods of constructing/initialising the constructor. The Factory Pattern is for use when the initialisation criteria result in you have different objects to construct.
У меня есть 1 ситуация, в которой фабрика полезна. Мне нужно создать видеоэффект для запуска на видео. В зависимости от типа видео, видеоэффект имеет разный конкретный класс.
Если я создаю конкретный класс, я теряю возможность добавлять дополнительные видеоэффекты позже без изменения кода создания экземпляра.
Когда я добавляю больше видеоэффектов, мне нужно только изменить фабрику, чтобы выбрать правильный конкретный класс.
Есть ли в этом смысл?
Возможно, фабрика иногда генерирует подтипы возвращаемый тип. Вы не можете сделать это с помощью конструктора, но получите гибкость с помощью фабрики.
Также имеет смысл использовать фабричный шаблон для использования подклассов, как проиллюстрировал ChrisW, если вы хотите реализовать полиморфизм через свои методы. Если
Department b = Department.createFromBoss();
Department l = Department.createFromLocation();
оба возвращают разные подклассы Department, тогда
b.Close()
и
l.Close()
, например, могут выполнять разные действия, что было бы более беспорядочно, если бы вам пришлось попробовать Close () одного объекта через перегрузку конструктора.