在.NET框架中,我经常看到用静态函数代替构造函数来构造新对象的成语。
例如,对于BigInteger,没有接受字符串的构造函数,所以这是不可能的:
BigInteger i = new BigInteger("1000000103453543897");但是有一个静态的解析函数。
BigInteger i = BigInteger.Parse("1000000103453543897");为什么这样的类设计经常被选中?
我唯一能想到的就是少了一个要创建的对象,然后再扔掉它。这是主要原因吗?还是有其他原因?
BigInteger(string value)
{
BigInteger result = new BigInteger(); // this one just returned in a Parse function
// compute bigint
// copy result to this
data = new uint[maxLength];
for (int i = 0; i < result.Length; i++)
data[i] = result.data[i];
Length = result.dataLength;
}发布于 2013-11-26 13:54:03
研究工厂方法模式可能有很多原因。
对于您的例子,很多人认为在构造函数中/从构造函数中调用重要的逻辑是一种糟糕的做法(我不想从构造函数中抛出异常,除非它是缺少的参数)。使用工厂方法允许实现,保证在对象构造时运行,而不是在构造函数中运行。
发布于 2013-11-26 13:57:54
没有接受字符串的构造函数
没有技术上的原因可以解释为什么你不能这样做。设计者只是选择不复制已经存在的代码,并且没有增加任何实用价值--它仍然是一行代码,你想要做什么就更清楚了,通过传递错误类型来减少错误数量等等。
它还使它与没有非默认构造函数(不能说是int i = new int(4))的其他数字类型一致;
底线是--这种构造函数中的值需要超过实现、测试、文档和发布新功能的成本。
发布于 2013-11-26 13:57:47
有关答案,请参见@Moho,Factory方法模式。
我个人认为BigInteger.Parse更好地涵盖了它。在本例中,您有一些值--字符串,您希望它将其转换为BigNumber。带有字符串参数的构造函数不会告诉wat将发生什么。据您所知,它只是使用字符串执行Console.WriteLine,而不是执行不同的操作。Parse告诉你更多的..。
https://stackoverflow.com/questions/20218898
复制相似问题