建模类时,首选的首选方法是什么:
使用其中任何一个会有什么考虑因素?
在某些情况下,我更喜欢有一个工厂方法,如果无法构造对象,则返回null.这使代码整洁.在执行替代操作之前,我可以简单地检查返回的值是否为null,与从构造函数中抛出异常相反.(我个人不喜欢例外)
比如说,我在类上有一个构造函数,它需要一个id值.构造函数使用此值从数据库填充类.如果不存在具有指定标识的记录,则构造函数将抛出RecordNotFoundException.在这种情况下,我将不得不在try..catch块中包含所有这些类的构造.
与此相反,我可以在这些类上有一个静态工厂方法,如果找不到记录,它将返回null.
在这种情况下,哪种方法更好,构造函数或工厂方法?
我想不出为什么一个比另一个更好的原因.比较这两个实现:
public class MyClass
{
public MyClass(string fileName)
{
// some code...
}
}
Run Code Online (Sandbox Code Playgroud)
而不是:
public class MyClass
{
private MyClass(){}
public static MyClass Create(string fileName)
{
// some code...
}
}
Run Code Online (Sandbox Code Playgroud)
.Net框架中有一些地方使用静态方法来创建实例.起初我在考虑,它注册它的实例来跟踪它们,但是常规构造函数可以通过使用私有静态变量来做同样的事情.
这种风格背后的原因是什么?
我正在阅读有效的Java,我认为标准的一些东西并没有被本书所建议,例如对象的创建,我的印象是构造函数是最好的方法,书籍说我们应该使用静态工厂方法,我不能少一些优点和缺点,所以我问这个问题,这是使用它的好处.
好处:
- 静态工厂方法的一个优点是,与构造函数不同,它们具有名称.
- 静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时创建新对象.
- 静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象.
- 静态工厂方法的第四个优点是它们减少了创建参数化类型实例的详细程度.
缺点:
- 仅提供静态工厂方法的主要缺点是没有公共或受保护构造函数的类不能被子类化.
- 静态工厂方法的第二个缺点是它们不容易与其他静态方法区分开.
参考:Effective Java,Joshua Bloch,第2版,第5-10页
我无法理解第四个优势和第二个缺点,如果有人能解释这些要点,我将不胜感激.我还想了解如何决定是使用构造函数还是静态工厂方法来创建对象.