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

时间:2011-09-05 13:31:32

标签: c# oop

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

,例如XmlReaderXmlTextReaderXmlWriterXmlTextWriter

我的问题是:

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

2 个答案:

答案 0 :(得分:3)

1)我所知道的唯一区别是泛型类型推断是supported for methods but not for constructors。因此,您可以写:

var str = "foo";
var num = 42;
var tuple = Tuple.Create(str, num);

虽然如果你想使用构造函数(不幸的是Tuple没有公共构造函数,所以示例不会编译)你必须写:

var tuple = new Tuple<string, int>(str, num);

当然这仅适用于泛型类型的构造函数,因此它并不是主流差异。

2)我怀疑这是一种“随机”(如果“随机”听起来很苛刻,那么让我们说“不是最好的做法最先考虑的事情”)决定,但我不知道有任何数据支持这一点。

3)工厂方法也是将对象强制转换为其祖先类型之一的唯一方法。有时这不仅是可取的,而且也是必要的,因为您的类型的用户可能不知道他们应该构造什么类型。例如,考虑一个返回Stream的工厂方法,该方法可能是RedStreamBlueStream,具体取决于某些输入参数。

答案 1 :(得分:0)

  

Create方法有什么特别之处,或者它只是一个   惯例

这只是如何命名工厂方法的惯例。

  

关于工厂方法与C#有什么好的做法?   构造

有些作为java,请记住.net框架现在显示它的年龄,并且没有删除任何内容。因此,它自身的框架并不总能显示出被认为是当前的良好实践。

  

我想主要问题是,在惯用的C#中,何时推荐   公开工厂方法以及公共构造者应该何时公开   暴露?

现在这是一个很好的问题,我认为答案在C#中是一样的 作为Java