创建对象的新实例而不使用“;新的”;

本文关键字:新的 新实例 实例 创建对象 | 更新日期: 2023-09-27 17:53:47

我面对下面的代码

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

在这里,它只是使用了XmlReader的调用方法来制作XmlReader的新对象。

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

有人能告诉我这条线路是怎么工作的吗?

创建对象的新实例而不使用“;新的”;

您正在调用的方法为您执行此操作:

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,但这里不是这样。(

这是一个工厂方法的例子。(这通常是朝着使用单独的工厂对象迈出的一步。(

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. 等等

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

你可以模仿这样的模式:

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


这就是它在下面的样子。

创建工厂方法有几个原因。是否要控制某个类型创建的所有实例?例如,你可以做这样的事情:

public class MyClass {
    private MyClass() // private constructor optional
    {}
    public void Create()
    {
        return new MyClass();
    }
}

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

工厂方法也可以在一个单独的类中。

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方法允许类将实例化推迟到子类。

点击此处阅读更多关于工厂方法的信息。