Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 为什么存在静态创建方法?_Language Agnostic_Design Patterns_Oop_Factory Pattern - Fatal编程技术网

Language agnostic 为什么存在静态创建方法?

Language agnostic 为什么存在静态创建方法?,language-agnostic,design-patterns,oop,factory-pattern,Language Agnostic,Design Patterns,Oop,Factory Pattern,我想知道,为什么存在静态创建方法 例如,为什么要使用此代码: System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri); System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri); 关于此代码: System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri); Syste

我想知道,为什么存在静态
创建
方法

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

System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);
System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);
关于此代码:

System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);
System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);
我找不到使用一个而不是另一个的理由,也找不到使用这个构造而不是另一个的类之间的任何关系

有人能解释一下吗?

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


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

因为它实际上可以创建派生类型的对象,而您无权访问或返回抽象类(如dtb所回答的)。这是。

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

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

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

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

有时它们是以自我文档的形式存在的。我有一个db access组件,可以使用连接字符串或配置文件中的连接名称来实例化它。这两种方法都将字符串作为参数,因此不能仅通过参数来区分它们。因此,我创建了一个
FromConnectionString(string)
factory方法和一个
FromConnectionName(string)
factory方法。这种细微差别将完全被
新的Foo(bool,string)
行所忽略。

一个更一般的答案

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


另一个原因是,factory方法实际上不需要创建新对象——如果需要,它可以反复返回相同的对象。

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


XmlReader
类的情况下,
Create
方法将返回
XmlDictionaryReader
XmlTextReader
XmlValidatingReader
XmlNodeReader
,取决于您使用的重载和向其发送的参数。

其思想是,通过这种方式,它们可以更改XmlReader的实现,而不会破坏任何用户代码(例如,它们可以更改从Create方法返回的实际类型)


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

从未注意到它是抽象的。每个类都有这样的方法吗?@GeReV:NET framework中有许多抽象类提供了Create方法。但这不是一个要求。这是一种设计模式。如果你真的阅读了你粘贴的维基百科文章,你会注意到它描述了一种完全不同的模式。它是相同的模式。根据传递给方法的参数,它会创建不同类型的对象。请重新读取。您链接的模式根据抽象Create方法的实际实现而不是传递给单个公共实现的参数来创建新实例。但情况非常相似。