作为“javaland”程序员,我习惯于工厂方法和多个构造函数。
我对工厂模式的主要用途是将决策延迟到运行时,在实例化期间执行某种副作用或限制或隐藏具体类型。
当我深入研究C#时,我看到越来越多的API混合了多个构造函数和静态Create
方法。
,例如XmlReader和XmlTextReader。 XmlWriter和XmlTextWriter。
我的问题是:
Create
方法有什么特别的东西,或者它只是一个约定(比如java:getInstance
)?Create
方法在XmlWriterSettings
中接受XmlWriter
个参数而在XmlTextWriter
中没有构造函数具有相同的目的?而另一方面,为什么只有构造函数接受Encoding
个参数?答案 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
的工厂方法,该方法可能是RedStream
或BlueStream
,具体取决于某些输入参数。
答案 1 :(得分:0)
Create方法有什么特别之处,或者它只是一个 惯例
这只是如何命名工厂方法的惯例。
关于工厂方法与C#有什么好的做法? 构造
有些作为java,请记住.net框架现在显示它的年龄,并且没有删除任何内容。因此,它自身的框架并不总能显示出被认为是当前的良好实践。
我想主要问题是,在惯用的C#中,何时推荐 公开工厂方法以及公共构造者应该何时公开 暴露?
现在这是一个很好的问题,我认为答案在C#中是一样的 作为Java