私のコードのいくつかでは、次のような静的ファクトリーがあります。
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です。
静的にするための引数は次のとおりです。
- クラスはステートレスであるため、インスタンス化する必要はありません
- ファクトリをインスタンス化するよりも静的メソッドを呼び出す方が自然なようです
シングルトンとしてのファクトリの引数は次のとおりです。
- すべてを注入するのが良い
- 工場の無国籍にもかかわらず、注入によりテストが簡単になります(簡単にモックできます)
- 消費者をテストするとき、それはock笑されるべきです
どのメソッドも静的であってはならないことを示唆しているように見えるため、シングルトンアプローチにはいくつかの深刻な問題があります。また、ユーティリティをStringUtils
ラップしてインジェクトする必要があることも示唆しているようですが、これはばかげているようです。最後に、ある時点で工場をモックする必要があることを意味しますが、これは正しくないと思われます。いつ工場をモックする必要があるのか考えられません。
コミュニティはどう思いますか?私はシングルトンアプローチが好きではありませんが、それに対してひどく強い議論を持っているようには見えません。
DateTime
とFile
クラスはまったく同じ理由でテストするのが難しいことで有名です。たとえば、コンストラクタにCreated
日付を設定するクラスがある場合、DateTime.Now
5分間隔で作成されたこれらのオブジェクトのうち2つを使用して単体テストを作成するにはどうすればよいですか?何年も離れていますか?あなたは本当にそれをすることはできません(多くの仕事なしで)。
private
コンストラクタとgetInstance()
メソッドを含めるべきではありませんか?申し訳ありませんが、不可解なnit-picker!