13

どの実装/サブクラスをインスタンス化するかを選択するとき、特にインターフェイスが静的メソッドを持つことができるようになったことを考えると、if/をどこに置くべきかについては明確ではありません。switch

インターフェイスといくつかの実装によって定義されたタイプのサービスがあるとしましょう。そのロジックをサービスに入れるのではなく、ファクトリメソッドにしたほうがいいのではないでしょうか。しかし、この回答で提案されているように、パラメーターから型へのマップを使用して、インターフェイスまたは別のクラスに配置する必要がありますか?

それをインターフェースに入れるのは私には自然に思えます:

public interface MyInterface
{
    public void doSomething();

    public static MyInterface create(int param)
    {
        if (param == 0)
            return new ImplA();
        else
            return new ImplB();
    }
}

次に、サービスから呼び出すだけです。

public class MyService
{
    public void serveMe(int param)
    {
        MyInterface.create(param).doSomething();
    }
}

しかし、インターフェースがその実装について知っているのが悪いのか、それとも親クラスがそのサブタイプについて知っているのが悪いのかはわかりません。そう

  1. そのロジックをどこに置くべきですか?
  2. タイプのサブクラスを選択している場合、それは大きく変わりますか?
4

2 に答える 2

8

これに使用Factoryします。この方法で維持できますsingle responsibility principle。ただし、私自身のプロジェクトの1つでは、interfaceこの特定の実装を使用する必要がある引数のタイプを決定するメソッドを定義しています。これと を使用するおかげでReflections、プロセス全体が自動化されます。Reflections指定されたものを実装するすべてのクラスを検索しinterface、その「使用タイプ」をマップに格納して高速検索を行います。このようなソリューションのおかげで、新しい実装が必要になった場合に開発者がしなければならないことは、それを作成することだけです。ファクトリ クラスであっても、システムの他の部分に変更を加える必要はありません。

Reflectionsコンパイル時にメタデータを保存する優れた機能があるため、適切なクラスのランタイム検索は瞬く間に行われます

于 2015-03-20T15:48:55.840 に答える
3

あなたの問題にはかなりの数の解決策があります。すでにそれらの多くを認識していると思います。

静的ファクトリ メソッド パターン

interface Interface {
    public static Interface create(...);
}

これは機能しますが、インターフェイスと実装の分離が難しくなります。インターフェイスは、可能なすべての実装を認識している必要があり、特に拡張可能ではありません。新しい実装を追加するには、インターフェースを変更する必要があります。

工場パターン

これは、本のGOFによる多かれ少なかれ古い学校です:

interface Factory {
    public Interface create(...)
}

これにより、ファクトリ (さらにはスタック ファクトリ) を置き換えることができます。ただし、ファクトリ オブジェクトを渡す必要があるという欠点があります。Java 8 では、非常に軽量なラムダベースのファクトリも使用できることに注意してください ( https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.htmlを参照) 。

コンテナ

別の解決策は、非常に重いものになる可能性がありますが、オブジェクトの構築をコンテナー フレームワークに任せることです。そのような場合、コンテナはオブジェクト ファクトリを提供します。オブジェクトの実際のタイプは構成に任されています。Spring と Java EE は、これをうまく処理します。また、追加効果のために依存性注入と組み合わせます。

これらは少なくとも私が考えることができるものです。

于 2015-03-20T15:58:44.743 に答える