14

我想知道,为什么Create存在静态方法?

例如,为什么使用此代码:

System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);

在这段代码上:

System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);

我找不到使用一个而不是另一个的理由,也找不到使用这个构造的类之间的任何关系。

任何人都可以对此有所了解吗?

4

9 回答 9

18

XmlReader是一个抽象类。你不能实例化它。

提供Create方法是工厂模式的一个实例。根据指定的参数,选择并返回 XmlReader 的不同实现。例如,.NET 框架中有验证和非验证 XmlReader 实现。

于 2010-03-18T13:57:19.493 回答
6

一个更一般的答案...

人们喜欢这些被称为“静态工厂方法”的方法的原因是你可以给它们一个名字(而不是构造函数)。因此,如果您需要三个不同的构造函数,则可以改为创建具有与其用途相关的名称的静态工厂方法。

另一个原因是工厂方法实际上并不需要创建新对象——如果需要,它可以一遍又一遍地返回相同的对象。

于 2010-03-18T14:02:34.733 回答
4

构造函数只能用于创建一个特定类的实例,而静态Create方法可以根据输入创建不同类的实例。

XmlReader类的情况下,该Create方法将返回一个XmlDictionaryReader、或XmlTextReader,这取决于您使用的重载以及您发送给它的参数。XmlValidatingReaderXmlNodeReader

于 2010-03-18T14:03:36.423 回答
4

因为它实际上可以创建您无权访问或返回抽象类的派生类型的对象(正如 dtb 回答的那样)。这是工厂方法模式

于 2010-03-18T13:57:39.040 回答
3
  • 因为您不必承诺您获得的确切类别的对象。构造函数只能从一个类中构造对象。
  • 因为你可以给方法一个有意义的名字,例如BigInt.probablePrime()。构造函数只能与类同名。
  • 因为同一参数类型组合可以有多个工厂方法,例如Point.fromPolarCoords(int, int) 和Point.fromCartesianCoords(int, int),但构造函数Point(int, int) 只能有一个。

(更详细的答案在 Bloch 的“Effective Java”中给出。)

于 2010-03-18T14:01:51.630 回答
3

这种模式允许XmlReader类为您提供根据您传递给的参数定制的派生类实例Create。特别注意接受XmlReaderSettings对象的重载。XmlReader根据您的设置,可以将不同的子类返回给您。

一个更好的例子是WebRequest.Create(url)。根据您传递的 URL,您可能会收到一个HttpWebRequest、一个FtpWebRequest等。

于 2010-03-18T13:59:55.870 回答
1

有时它们以自我记录的形式存在。我有一个数据库访问组件,我可以使用连接字符串或配置文件中的连接名称来实例化它。这两种方法都将字符串作为参数,因此不能仅通过参数来区分它们。所以我创建了一个FromConnectionString(string)工厂方法和一个FromConnectionName(string)工厂方法。这种细微差别将完全消失在一条new Foo(bool, string)线上。

于 2010-03-18T14:02:33.207 回答
0

想法是这样他们可以更改 XmlReader 的实现而不破坏任何用户代码(例如,他们可以更改从 Create 方法返回的实际类型)。

我个人不喜欢这种方法,因为它在 XmlReader 类层次结构中创建了反向关系。也许他们认为工厂模式太过分了?

于 2010-03-18T14:06:37.393 回答
0

封装对象创建

于 2010-03-19T09:23:27.127 回答