Почему делают статичный, Создают методы, существуют?

Я задавался вопросом, почему делают статичный Create методы существуют?

Например, почему используют этот код:

System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);

по этому коду:

System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);

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

Кто-либо может пролить некоторый свет на это?

14
задан skaffman 18 March 2010 в 14:00
поделиться

9 ответов

XmlReader - это абстрактный класс. Вы не можете его инстанцировать.

Предоставление метода Create является примером паттерна фабрики. В зависимости от указанных аргументов выбирается и возвращается различная реализация XmlReader. Например, во фреймворке .NET существуют валидирующие и невалидирующие реализации XmlReader.

17
ответ дан 1 December 2019 в 07:12
поделиться

Более общий ответ ...

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

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

6
ответ дан 1 December 2019 в 07:12
поделиться

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

4
ответ дан 1 December 2019 в 07:12
поделиться

Иногда они существуют как форма самодокументирования. У меня есть компонент доступа к базе данных, который я могу создать либо с помощью строки подключения, либо имени подключения в файле конфигурации. Оба эти метода принимают строки в качестве параметра, поэтому их нельзя различить только по аргументам. Итак, я создал фабричный метод FromConnectionString (строка) и фабричный метод FromConnectionName (string) . Этот нюанс был бы полностью потерян новой строкой Foo (bool, string) .

1
ответ дан 1 December 2019 в 07:12
поделиться

Этот шаблон позволяет классу XmlReader предоставлять вам экземпляры производных классов, адаптированные к параметрам, которые вы передали в Create ]. Обратите внимание, в частности, на перегрузки, которые принимают объект XmlReaderSettings . Другой подкласс XmlReader может быть возвращен вам в зависимости от ваших настроек.

Лучшим примером является WebRequest.Create (url) . В зависимости от переданного URL-адреса вы можете получить HttpWebRequest , FtpWebRequest и т. Д.

3
ответ дан 1 December 2019 в 07:12
поделиться

Идея состоит в том, что таким образом они могут изменить реализацию XmlReader и не нарушить какой-либо пользовательский код (например, они могут изменить фактический тип, возвращаемый из Создать метод).

Мне лично не нравится этот подход, потому что он создает обратную связь в иерархии классов XmlReader. Может быть, они думали, что шаблон Factory - это излишество?

0
ответ дан 1 December 2019 в 07:12
поделиться

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

В случае класса XmlReader метод Create вернет XmlDictionaryReader , XmlTextReader , XmlValidatingReader ] или XmlNodeReader , в зависимости от того, какую перегрузку вы используете и какие параметры вы ей отправляете.

4
ответ дан 1 December 2019 в 07:12
поделиться
  • Потому что вам не нужно фиксировать точный класс объекта, который вы получаете. Конструкторы могут создавать объекты только из одного класса.
  • Потому что вы можете дать методу осмысленное имя, например BigInt.probablePrime(). Конструкторы могут иметь только то же имя, что и класс.
  • Потому что вы можете иметь более одного фабричного метода для одной и той же комбинации типов параметров, например Point.fromPolarCoords(int, int) и Point.fromCartesianCoords(int, int), но может быть только один конструктор Point(int, int).

(Гораздо более подробный ответ дан в книге Блоха "Эффективная Java")

.
3
ответ дан 1 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

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