不使用" new"创建对象的新实例

时间:2015-06-05 15:02:29

标签: c#

我面对下面的代码

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

这里创建XmlReader的新对象,它只使用XmlReader的调用方法。

我知道这里Create是一种静态方法,但对我来说有点奇怪。 我曾经利用new字来命令制作新实例。

有谁能告诉我这条线是如何工作的?

5 个答案:

答案 0 :(得分: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(...);
    }
}

(通过使用一种名为 reflection 的技术可以完全避免new,但这不是这里发生的事情。)

答案 1 :(得分: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. 您有一个更复杂的继承结构,并希望公开顶级抽象工厂。

答案 2 :(得分:1)

这是一个静态方法,在它的主体中,创建一个新对象(使用new)并返回它。

你可以仿效这样的模式:

public class Foo
{
    public static Foo Create()
    {
        return new Foo();
    }
}

答案 3 :(得分: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);
 } 
}


这就是它的样子。

答案 4 :(得分:0)

创建工厂方法有几个原因。您想要控制所有创建的类型实例吗?例如,你可以这样做:

:

(私有构造函数通常用于实现Singleton Pattern

工厂方法也可以是单独的类。

public class MyClass {

    private MyClass() // private constructor optional
    {}

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

}
  

工厂方法定义用于创建对象的接口,但让子类决定实例化哪个类。 Factory Method允许类将实例化延迟到子类。

详细了解Factory Methods here.