作为"javaland"程序员,我习惯于工厂方法和多个构造函数.我对工厂模式的主要用途是将决策延迟到运行时,在实例化期间执行某种副作用或限制或隐藏具体类型.当我深入研究C#时,我看到越来越多的API混合了多个构造函数和静态Create方法.
例如,XmlReader和XmlTextReader.XmlWriter和XmlTextWriter.
我的问题是:
Create方法有什么特别的东西,或者它只是一个约定(比如java :) getInstance?Create方法接受XmlWriterSettings参数XmlWriter而没有构造函数XmlTextWriter具有相同的目的?而另一方面,为什么只有构造函数接受Encoding参数呢?1)我知道的唯一区别是方法支持泛型类型推断,但构造函数不支持。因此,你可以写:
var str = "foo";
var num = 42;
var tuple = Tuple.Create(str, num);
Run Code Online (Sandbox Code Playgroud)
如果您想使用构造函数(不幸的Tuple是没有公共构造函数,因此该示例将无法编译),您必须编写:
var tuple = new Tuple<string, int>(str, num);
Run Code Online (Sandbox Code Playgroud)
当然,这仅适用于泛型类型的构造函数,因此这并不完全是主流差异。
2)我怀疑这是一种“随机”(如果“随机”听起来很刺耳,那么我们可以说“不是首先考虑到最佳实践”)决定,但我没有任何数据来支持这一点。
3)工厂方法也是将对象强制转换为其祖先类型之一返回的唯一方法。有时这不仅是可取的,而且也是必要的,因为您的类型的用户可能不知道他们应该构造什么类型。例如,考虑一个返回 a 的工厂方法,Stream该方法可能是 aRedStream或 a BlueStream,具体取决于某些输入参数。