多个构造函数与静态Create方法

Ant*_*oly 5 c# oop

作为"javaland"程序员,我习惯于工厂方法和多个构造函数.我对工厂模式的主要用途是将决策延迟到运行时,在实例化期间执行某种副作用或限制或隐藏具体类型.当我深入研究C#时,我看到越来越多的API混合了多个构造函数和静态Create方法.

例如,XmlReaderXmlTextReader.XmlWriterXmlTextWriter.

我的问题是:

  1. Create方法有什么特别的东西,或者它只是一个约定(比如java :) getInstance
  2. 关于工厂方法与构造函数的C#有哪些好的做法?例如,为什么有几个Create方法接受XmlWriterSettings参数XmlWriter而没有构造函数XmlTextWriter具有相同的目的?而另一方面,为什么只有构造函数接受Encoding参数呢?
  3. 我想主要的问题是,在惯用的C#中,何时建议公开工厂方法以及何时公开构造函数?

Jon*_*Jon 3

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,具体取决于某些输入参数。