2011-09-05 58 views
4

作为一名“javaland”程序员,我习惯于Factory Methods和Multiple Constructors。 我的工厂模式主要用于延迟决策,直到运行时,在实例化过程中执行某种副作用或限制或隐藏具体类型。当我深入C#时,我发现越来越多的API将多个构造函数和静态方法混合在一起。多构造函数vs静态创建方法

例如,XmlReaderXmlTextReaderXmlWriterXmlTextWriter

我的问题是:

  1. 是不是有什么特殊的用Create方法或者它仅仅是一个约定(如Java:getInstance)?
  2. C#中有关工厂方法vs构造函数的最佳实践是什么?为什么,例如,有几个Create方法可以接受XmlWriter中的XmlWriterSettings参数,并且在XmlTextWriter中没有构造函数具有相同的用途?另一方面,为什么只有建设者接受Encoding的论点?
  3. 我猜主要问题是,在习惯C#中,什么时候推荐暴露工厂方法,何时公开构造函数被暴露?
+0

,我不认为这是特别是C#的问题是相同的 - 这是一个面向对象的问题,首要的。既然如此,那至少是[this one]的部分欺骗(http://stackoverflow.com/q/628950/27615)。 – razlebe

+0

我想我想要“惯用的c#意见”,但除此之外你是对的,这是一个通用的问题。我只是认为来自不同语言和文化的程序员可能对此有不同的见解。 –

回答

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

是不是有什么特别的与创建方法或者它仅仅是一个 约定

这仅仅是如何命名的工厂方法的公约。

C#关于工厂方法的最佳实践vs 构造函数?

有些作为Java,请记住.net框架现在显示它的年龄,并没有任何东西都被删除。所以它自身的框架并不总是显示被认为是当前的良好实践。

我想主要的问题是,在地道的C#,建议使用这种 时揭露工厂方法和公共的构造函数时,应 暴露?

现在是一个很好的问题,我想答案是C# 如Java