Когда имеет смысл использовать шаблон фабрики, а не перегруженный конструктор для создания экземпляра объекта? - PullRequest
8 голосов
/ 09 октября 2009

В Основах программирования Карла Сегуина есть небольшой раздел по использованию заводского шаблона. Он закрывает отрывок, заявляя, что «вы можете выполнить те же функции с перегрузкой конструктора», но не указывает, когда и почему?

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

Ответы [ 7 ]

4 голосов
/ 09 октября 2009

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

4 голосов
/ 09 октября 2009

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

2 голосов
/ 09 октября 2009

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


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

Department
{
  //static factory methods
  public static Department createFromBoss(string bossName) { ... }
  public static Department createFromLocation(string locationName) { ... }
}
1 голос
/ 09 октября 2009

Я не согласен с его утверждением. Разные конструкторы используются, когда у вас разные методы конструирования / инициализации конструктора. Фабричный шаблон предназначен для использования, когда критерии инициализации приводят к созданию различных объектов.

0 голосов
/ 12 октября 2009

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

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

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

b.Close()

и

l.Close()
Например,

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

0 голосов
/ 09 октября 2009

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

0 голосов
/ 09 октября 2009

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

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

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

Имеет ли это смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...