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