作为“javaland”程序员,我习惯了工厂方法和多个构造函数。
我对工厂模式的主要用途是将决策延迟到运行时,在实例化期间执行某种副作用或限制或隐藏具体类型。
当我深入研究 C# 时,我看到越来越多的 API 混合了多个构造函数和静态 Create
方法。
例如,XmlReader和 XmlTextReader . XmlWriter和 XmlTextWriter .
我的问题是:
Create
方法有什么特别之处还是只是一种约定(如 java:getInstance
)?- C# 中关于工厂方法与构造函数的最佳做法是什么?例如,为什么有几个
Create
方法接受XmlWriter
中的XmlWriterSettings
参数,而XmlTextWriter
中没有构造函数同一个目的?而且,另一方面,为什么只有构造函数接受Encoding
参数? - 我想主要问题是,在惯用的 C# 中,建议何时公开工厂方法以及何时应该公开公共(public)构造函数?
最佳答案
1) 我所知道的唯一区别是泛型类型推断是 supported for methods but not for constructors .因此,你可以这样写:
var str = "foo";
var num = 42;
var tuple = Tuple.Create(str, num);
如果你想使用构造函数(不幸的是 Tuple
没有公共(public)构造函数,所以这个例子不会编译)你必须这样写:
var tuple = new Tuple<string, int>(str, num);
当然这只适用于泛型类型的构造函数,所以这不完全是主流差异。
2) 我怀疑这是一个“随机”的决定(如果“随机”听起来很刺耳,那么我们可以说“没有首先考虑最佳实践”),但我不没有任何数据支持这一点。
3) 工厂方法也是您可以返回转换为其祖先类型之一的对象的唯一方法。有时这不仅是可取的,而且是必要的,因为您的类型的用户可能不知道他们应该构造什么类型。例如,考虑一个返回 Stream
的工厂方法,它可能是 RedStream
或 BlueStream
,具体取决于某些输入参数。
关于c# - 多个构造函数与静态 Create 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7308831/