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方法的实际实现而不是传递给单个公共实现的参数来创建新实例。但情况非常相似。