在我的某些代码中,我有一个类似于以下内容的静态工厂:
public class SomeFactory {
// Static class
private SomeFactory() {...}
public static Foo createFoo() {...}
public static Foo createFooerFoo() {...}
}
在代码审查期间,建议将其作为一个单例并注入。因此,它应如下所示:
public class SomeFactory {
public SomeFactory() {}
public Foo createFoo() {...}
public Foo createFooerFoo() {...}
}
需要强调的几件事:
- 两个工厂都是无状态的。
- 方法之间的唯一区别是它们的范围(实例与静态)。实现是相同的。
- Foo是没有接口的bean。
我要静态化的参数是:
- 该类是无状态的,因此不需要实例化
- 能够调用静态方法比必须实例化工厂似乎更自然。
工厂作为单例的参数是:
- 注入一切都很好
- 尽管工厂是无状态的,但使用注入进行测试还是比较容易的(易于模拟)
- 测试消费者时应该嘲笑它
我对单例方法有一些严重的问题,因为它似乎表明任何方法都不应该是静态的。它还似乎暗示StringUtils
应该包装和注入诸如此类的实用程序,这似乎很愚蠢。最后,这意味着我需要在某个时候模拟工厂,这似乎不正确。我想不起来何时需要模拟工厂。
社区对此有何看法?尽管我不喜欢单例方法,但我似乎对此没有强烈的反对意见。
DateTime
and File
类进行测试。例如,如果您有一个在构造函数中将Created
日期设置为的类,那么DateTime.Now
如何使用间隔5分钟创建的两个对象来创建单元测试?那相隔几年呢?您真的不能这样做(无需大量工作)。
private
构造函数和getInstance()
方法吗?抱歉,挑剔的人!