2010-03-18 49 views
14

我想知道,为什么会有静态的Create方法存在?为什么静态创建方法存在?

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

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

在这段代码:

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

我找不到理由使用了另一种,并不能找到任何关系在使用这个构造的类之间。

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

回答

17

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

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

+0

从来没有注意到它是抽象的事实。这对每个拥有这种方法的班级都是如此吗? – GeReV 2010-03-18 14:00:48

+1

+1,但你可能已经花了几行来举一个小例子。 – 2010-03-18 14:01:30

+0

@GeReV:在.NET框架中有许多抽象类提供了一种Create方法。但这不是要求。这是一种设计模式。 – dtb 2010-03-18 14:02:47

5

因为它实际上可以创建和派生类型的对象,你无法访问或返回一个抽象类(如dtb回答)。这是factory method pattern

+0

那么,如果你真的读了你粘贴的维基百科文章,你会发现它描述了一个完全不同的模式。 – Grzenio 2010-03-18 14:03:02

+0

这是一样的模式。根据传递给方法的参数,它创建不同类型的对象。 – 2010-03-18 14:06:09

+1

再次阅读。链接的模式根据抽象Create方法的实际实现创建新实例,而不是传递给单个通用实现的参数。虽然它非常相似。 – dtb 2010-03-18 14:08:53

3

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

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

3
  • 因为你没有承诺的确切类对象的你。构造函数只能从一个类构造对象。
  • 因为您可以给该方法一个有意义的名称,例如BigInt.probablePrime()。构造函数只能与该类具有相同的名称。
  • 因为对于相同的参数类型组合,您可以有多个工厂方法,例如, Point.fromPolarCoords(int,int)和Point.fromCartesianCoords(int,int),但只能有一个构造函数Point(int,int)。

(更详细的答案是在布洛赫的“有效的Java”。给出)

1

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

6

一个更普遍的答案...

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

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

4

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

XmlReaderCreate方法的情况下会返回一个XmlDictionaryReaderXmlTextReaderXmlValidatingReaderXmlNodeReader,这取决于你超负荷使用什么参数,你给它。

0

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

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

相关问题