为什么存在静态Create方法?

时间:2010-03-18 13:55:46

标签: language-agnostic design-patterns oop factory-pattern

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

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

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

这段代码:

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

我找不到使用one over other的理由,也找不到使用这种结构的类与其他类之间的任何关系。

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

9 个答案:

答案 0 :(得分:17)

XmlReader是一个抽象类。你无法实例化它。

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

答案 1 :(得分:6)

更一般的答案......

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

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

对于XmlReader类,Create方法将返回XmlDictionaryReaderXmlTextReaderXmlValidatingReaderXmlNodeReader,具体取决于您使用哪种重载以及发送给它的参数。

答案 4 :(得分:3)

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

更好的例子是WebRequest.Create(url)。根据您传递的网址,您可能会收到HttpWebRequestFtpWebRequest等。

答案 5 :(得分:3)

  • 因为您不必提交您获得的确切类对象。构造函数只能从一个类构造对象。
  • 因为您可以为方法指定一个有意义的名称,例如BigInt.probablePrime()。构造函数只能与类具有相同的名称。
  • 因为您可以为同一参数类型组合使用多个工厂方法,例如Point.fromPolarCoords(int,int)和Point.fromCartesianCoords(int,int),但只能有一个构造函数Point(int,int)。

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)