Когда имеет больше смысла использовать шаблон "фабрика", а не перегруженного конструктора для инстанцирования объекта?

Не поблочное тестирование достаточно. Действительно трудно вымыться и осуществить рефакторинг код, если у Вас нет модульных тестов. И без постоянного рефакторинга и очистки, гниль кода начинает начинаться и распространяться.

Используя шаблон "одиночка" для совместного использования объектов, как + [MyObject defaultObject]. Это - по существу глобальная переменная, которая делает для некоторых хороших скрытых зависимостей и связи. Это, в свою очередь, делает код тяжелее для тестирования.

8
задан JaredCacurak 9 October 2009 в 00:55
поделиться

7 ответов

Если вы хотите иметь более слабую связь, тогда завод имеет больше смысла, так как тогда вы можете просто позвонить на завод по производству автомобилей, передать перечисление suv и возвращается правильный класс. Ваше приложение не заботится о том, какой класс был фактически возвращен, если он соответствует вашим потребностям.

4
ответ дан 5 December 2019 в 15:25
поделиться

Если вы выполняете Внедрение зависимостей , но вам нужно создать экземпляры зависимости по мере необходимости внутри зависимого, один из вариантов - внедрить интерфейс в фабрику классов. Фабрика может возвращать интерфейс или абстрактный класс. Это обеспечивает гибкость, тестируемость,

4
ответ дан 5 December 2019 в 15:25
поделиться

Я использую фабрику, когда хочу, чтобы фабрика построила один из нескольких различных возможных подклассов (и я хочу, чтобы вызывающий знал о базовом классе, но не знал о подклассах).


Кроме того, иногда я буду использовать статические методы класса вместо перегруженного конструктора, когда разные статические методы принимают одни и те же типы параметров (и поэтому конструкторы не могут быть перегружены на основе одного типа параметра). Вот надуманный пример:

Department
{
  //static factory methods
  public static Department createFromBoss(string bossName) { ... }
  public static Department createFromLocation(string locationName) { ... }
}
2
ответ дан 5 December 2019 в 15:25
поделиться

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
ответ дан 5 December 2019 в 15:25
поделиться

У меня есть 1 ситуация, в которой фабрика полезна. Мне нужно создать видеоэффект для запуска на видео. В зависимости от типа видео, видеоэффект имеет разный конкретный класс.

Если я создаю конкретный класс, я теряю возможность добавлять дополнительные видеоэффекты позже без изменения кода создания экземпляра.

Когда я добавляю больше видеоэффектов, мне нужно только изменить фабрику, чтобы выбрать правильный конкретный класс.

Есть ли в этом смысл?

0
ответ дан 5 December 2019 в 15:25
поделиться

Возможно, фабрика иногда генерирует подтипы возвращаемый тип. Вы не можете сделать это с помощью конструктора, но получите гибкость с помощью фабрики.

0
ответ дан 5 December 2019 в 15:25
поделиться

Также имеет смысл использовать фабричный шаблон для использования подклассов, как проиллюстрировал ChrisW, если вы хотите реализовать полиморфизм через свои методы. Если

Department b = Department.createFromBoss();
Department l = Department.createFromLocation();

оба возвращают разные подклассы Department, тогда

b.Close()

и

l.Close()

, например, могут выполнять разные действия, что было бы более беспорядочно, если бы вам пришлось попробовать Close () одного объекта через перегрузку конструктора.

0
ответ дан 5 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: