Я задавался вопросом, почему делают статичный Create
методы существуют?
Например, почему используют этот код:
System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);
по этому коду:
System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);
Я не могу найти объяснение для использования того по другому и не могу найти отношение между классами, кто использует эту конструкцию по другому.
Кто-либо может пролить некоторый свет на это?
XmlReader - это абстрактный класс. Вы не можете его инстанцировать.
Предоставление метода Create
является примером паттерна фабрики. В зависимости от указанных аргументов выбирается и возвращается различная реализация XmlReader. Например, во фреймворке .NET существуют валидирующие и невалидирующие реализации XmlReader.
Более общий ответ ...
Причина, по которой людям нравятся такие методы, известные как "статические фабричные методы", заключается в том, что вы можете дать им имя (в отличие от конструкторов). Поэтому, если вам нужны три разных конструктора, вы можете вместо этого создать статические фабричные методы, имена которых соответствуют их использованию.
Другая причина в том, что фабричный метод не требует создания новых объектов - он может возвращать один и тот же снова и снова, если это необходимо.
Потому что он может фактически создать и объект производного типа, к которым у вас нет доступа, или вернуть абстрактный класс (как ответил dtb). Это шаблон фабричного метода.
Иногда они существуют как форма самодокументирования. У меня есть компонент доступа к базе данных, который я могу создать либо с помощью строки подключения, либо имени подключения в файле конфигурации. Оба эти метода принимают строки в качестве параметра, поэтому их нельзя различить только по аргументам. Итак, я создал фабричный метод FromConnectionString (строка)
и фабричный метод FromConnectionName (string)
. Этот нюанс был бы полностью потерян новой строкой Foo (bool, string)
.
Этот шаблон позволяет классу XmlReader
предоставлять вам экземпляры производных классов, адаптированные к параметрам, которые вы передали в Create
]. Обратите внимание, в частности, на перегрузки, которые принимают объект XmlReaderSettings
. Другой подкласс XmlReader
может быть возвращен вам в зависимости от ваших настроек.
Лучшим примером является WebRequest.Create (url)
. В зависимости от переданного URL-адреса вы можете получить HttpWebRequest
, FtpWebRequest
и т. Д.
Идея состоит в том, что таким образом они могут изменить реализацию XmlReader и не нарушить какой-либо пользовательский код (например, они могут изменить фактический тип, возвращаемый из Создать метод).
Мне лично не нравится этот подход, потому что он создает обратную связь в иерархии классов XmlReader. Может быть, они думали, что шаблон Factory - это излишество?
Конструктор может использоваться только для создания экземпляров одного определенного класса, в то время как статический метод Create
может создавать экземпляры разных классов в зависимости от входных данных.
В случае класса XmlReader
метод Create
вернет XmlDictionaryReader
, XmlTextReader
, XmlValidatingReader
] или XmlNodeReader
, в зависимости от того, какую перегрузку вы используете и какие параметры вы ей отправляете.
(Гораздо более подробный ответ дан в книге Блоха "Эффективная Java")
.