내 코드 중 일부에는 다음과 비슷한 정적 팩토리가 있습니다.
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는 인터페이스가없는 빈입니다.
내가 정적으로가는 논쟁은 다음과 같습니다.
- 클래스는 상태가 없으므로 인스턴스화 할 필요가 없습니다.
- 팩토리를 인스턴스화하는 것보다 정적 메소드를 호출하는 것이 더 자연스러운 것 같습니다.
싱글 톤으로서의 팩토리에 대한 논쟁은
- 모든 것을 주입하는 것이 좋습니다
- 공장의 무국적 상태에도 불구하고 주입으로 테스트하기가 더 쉽습니다 (조롱하기 쉬움).
- 소비자를 테스트 할 때 조롱해야합니다.
싱글 톤 방식에는 심각한 문제가 있습니다. 왜냐하면 정적 인 방법이 없다는 것을 암시하는 것 같습니다. 또한 StringUtils
랩핑 및 주입과 같은 유틸리티 는 어리석은 것처럼 보입니다. 마지막으로, 언젠가는 공장을 조롱해야한다는 것을 의미합니다. 언제 공장을 조롱해야하는지 생각할 수 없습니다.
커뮤니티는 어떻게 생각합니까? 나는 싱글 톤 접근법을 좋아하지 않지만 그것에 대해 굉장히 강력한 논쟁은하지 않는 것 같습니다.
DateTime
and File
클래스는 정확히 같은 이유로 테스트하기가 어렵습니다. 예를 들어 생성자에서 Created
날짜를 설정하는 클래스가있는 경우 DateTime.Now
5 분 간격으로 생성 된이 두 개체로 단위 테스트를 작성하는 방법은 무엇입니까? 몇 년 떨어져 있습니까? 당신은 정말로 (많은 일없이) 그렇게 할 수 없습니다.
private
생성자와 getInstance()
메소드 가 없어야 합니까? 죄송합니다, 엄밀한 nit-picker!