2015-06-05 2 views
3

я столкнулся с кодом нижеСоздание нового экземпляра объекта без использования «новой»

XmlReader xmlreader = 
    XmlReader.Create("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"); 

здесь, чтобы сделать новый объект из XmlReader, он просто использовал метод XmlReader вызова.

Я знаю здесь Create - это статический метод, но для меня это немного странно. Я использовал для использования new слово для команды, создающей новый экземпляр.

Может кто-нибудь скажет мне, как работает эта линия?

+1

[Просто посмотрите на исходный код] (http://referencesource.microsoft.com/#System.Xml/System/Xml/Core/XmlReader.cs,009e2d1038282c97). (Следуйте за ним до [фактического «нового» вызова] (http://referencesource.microsoft.com/#System.Xml/System/Xml/Core/XmlReaderSettings.cs,450)). –

ответ

10

вы вызываете метод делает это для вас:

public class XmlReader { 
    public static XmlReader Create(String url) { 
     // There's probably a lot of fancy code in this method, but it'll use new somewhere 
     return new XmlReader(...); 
    } 
} 

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

10

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

В некотором роде XmlReader.Create он использует ключевое слово new. Чтобы создать экземпляр нового экземпляра объекта, вам нужно использовать new для вызова конструктора. Однако для уменьшения связи между объектами можно абстрагироваться от заводского метода или фабричного объекта.

Например, эти две реализации делают примерно то же самое:

public class Widget 
{ 
    public Widget() { } 
} 

//... elsewhere ... 

var widget = new Widget(); 

И:

public class Widget 
{ 
    private Widget() { } 

    public static Widget Create() 
    { 
     return new Widget(); 
    } 
} 

//... elsewhere ... 

var widget = Widget.Create(); 

В примере это простой, есть небольшая разница между ними. Поскольку код развивается и становится более сложным, может быть ряд веских причин выбирать один из них. Например:

  1. Существуют сложные конструкторы, и вы хотите открыть простой интерфейс для создания экземпляра.
  2. Конструкторы, вероятно, будут часто меняться, и вы хотите, чтобы пользователи вашей библиотеки имели один неизменный интерфейс.
  3. При создании объекта существует значительная логика, и вы хотите перенести эту логику на свой собственный объект.
  4. Вы хотите использовать отдельный объект для макетирования при автоматическом тестировании.
  5. У вас есть более сложная структура наследования и вы хотите открыть абстрактную фабрику верхнего уровня.
  6. т.д.
1

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

Вы можете имитировать рисунок как так:

public class Foo 
{ 
    public static Foo Create() 
    { 
     return new Foo(); 
    } 
} 
0
public class Foo 
{ 
public string Prop { get;set; } 
public Foo(string prop) 
{ 
    Prop = prop; 
} 

public static Foo Create(string prop) 
{ 
    return new Foo(prop); 
} 
} 


Вот как это может выглядеть как под.

0

Существует несколько причин для создания заводских методов. Вы хотите контролировать все экземпляры, созданные для типа? Например, вы могли бы сделать что-то вроде этого:

public class MyClass { 

    private MyClass() // private constructor optional 
    {} 

    public void Create() 
    { 
     return new MyClass(); 
    } 

} 

(частные конструкторы часто используются для реализации Singleton Pattern)

фабричных методов также могут быть в отдельном классе.

public class MyClass { 
    internal MyClass() // means only Classes of same assembly may access this 
    {} 

} 

public class MyClassFactory { 

    public void NewMyClass() 
    { 
     // Do some license checking here or whatever 
     return new MyClass(); 
    } 
} 

Factory Методы определяют интерфейс для создания объекта, но пусть подклассы решить, какой класс инстанцировать. Фабричный метод позволяет создать экземпляр класса для подклассов.

Подробнее о Factory Methods here.

Смежные вопросы