我面对下面的代码
XmlReader xmlreader =
XmlReader.Create("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
这里创建XmlReader
的新对象,它只使用XmlReader
的调用方法。
我知道这里Create
是一种静态方法,但对我来说有点奇怪。
我曾经利用new
字来命令制作新实例。
有谁能告诉我这条线是如何工作的?
答案 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();
在一个简单的例子中,两者之间的差别不大。随着代码的发展和变得越来越复杂,可以有许多令人信服的理由来选择一个而不是另一个。例如:
答案 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允许类将实例化延迟到子类。