创建对象的新实例而不使用“;新的”;
本文关键字:新的 新实例 实例 创建对象 | 更新日期: 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();
在一个如此简单的例子中,两者之间几乎没有区别。随着代码的发展和变得越来越复杂,可能有很多令人信服的理由来选择其中一个。例如:
- 有一些复杂的构造函数,您希望公开一个用于构建实例的简单接口
- 构造函数可能会经常更改,并且您希望库的使用者拥有一个不变的接口
- 构建对象时会调用重要的逻辑,并且您希望将该逻辑移动到它自己的对象
- 您希望在自动化测试中使用一个单独的对象来实现可模拟性
- 您有一个更复杂的继承结构,并且希望公开一个顶级抽象工厂
- 等等
这是一个静态方法,在它的主体中创建一个新对象(使用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方法允许类将实例化推迟到子类。
点击此处阅读更多关于工厂方法的信息。