我在想,为什么存在静态Create
方法?
例如,为什么要使用此代码:
System.Xml.XmlReader reader = System.Xml.XmlReader.Create(inputUri);
这段代码:
System.Xml.XmlReader reader = new System.Xml.XmlReader(inputUri);
我找不到使用one over other的理由,也找不到使用这种结构的类与其他类之间的任何关系。
任何人都可以对此有所了解吗?
答案 0 :(得分:17)
XmlReader是一个抽象类。你无法实例化它。
提供Create
方法是工厂模式的一个实例。根据指定的参数,选择并返回不同的XmlReader实现。例如,.NET框架中有验证和非验证的XmlReader实现。
答案 1 :(得分:6)
更一般的答案......
人们喜欢这种方法的原因,被称为“静态工厂方法”,是因为你可以给它们一个名字(而不是构造函数)。因此,如果您需要三个不同的构造函数,则可以创建静态工厂方法,这些方法的名称与其使用相关。
另一个原因是工厂方法实际上并不需要创建新对象 - 如果需要,它可以一遍又一遍地返回相同的对象。
答案 2 :(得分:4)
因为它实际上可以创建和派生类型的对象,你无法访问或返回一个抽象类(如dtb回答)。这是factory method pattern。
答案 3 :(得分:4)
构造函数只能用于创建一个特定类的实例,而静态Create
方法可以根据输入创建不同类的实例。
对于XmlReader
类,Create
方法将返回XmlDictionaryReader
,XmlTextReader
,XmlValidatingReader
或XmlNodeReader
,具体取决于您使用哪种重载以及发送给它的参数。
答案 4 :(得分:3)
此模式允许XmlReader
类为您提供根据传递给Create
的参数定制的派生类的实例。请特别注意接受XmlReaderSettings
对象的重载。根据您的设置,可以向您返回不同的XmlReader
子类。
更好的例子是WebRequest.Create(url)
。根据您传递的网址,您可能会收到HttpWebRequest
,FtpWebRequest
等。
答案 5 :(得分:3)
(布洛赫的“有效Java”中给出了更详细的答案。)
答案 6 :(得分:1)
有时它们作为自我记录的形式存在。我有一个db访问组件,我可以使用连接字符串或配置文件中的连接名称进行实例化。这两种方法都将字符串作为参数,因此不能仅通过参数区分它们。所以我创建了一个FromConnectionString(string)
工厂方法和一个FromConnectionName(string)
工厂方法。这种细微差别将完全由new Foo(bool, string)
行丢失。
答案 7 :(得分:0)
这个想法是这样他们可以改变XmlReader的实现而不破坏任何用户代码(例如,他们可以改变从Create方法返回的实际类型)。
我个人不喜欢这种方法,因为它在XmlReader类层次结构中创建了一个反向关系。也许他们认为工厂模式有点矫枉过正?
答案 8 :(得分:0)