5

静的メソッドと単一のプライベートコンストラクターのみを含む一連のAPIクラスがあるため、インスタンス化できません。ただし、サードパーティの開発者がAPIの動作をニーズに合わせて変更できるようにしたいと思います。


これは私がこれまでに持っている解決策です(静的セッター法による依存性注入)。これは、開発者が使用するパブリックAPIクラスです。ご覧のとおり、に依存していStaticApiImplます。

public class StaticApi {
    private static StaticApiImpl impl = new StaticApiImpl();

    private StaticApi() {}

    public static void setImpl(StaticApiImpl impl) {
        StaticApi.impl = impl;
    }

    public static void doThing() {
        impl.doThing();
    }
}

これは、自分でコーディングしたデフォルトのAPI実装です。

public class StaticApiImpl {
    public void doThing() {
        System.out.println("Do thing the default way.");
    }
}

これは、サードパーティが作成する可能性のあるデフォルトの実装の架空の拡張バージョンです。

public class MyCustomStaticApiImpl extends StaticApiImpl {
    @Override
    public void doThing() {
        System.out.println("Do thing differently.");
    }
}

次に、開発者は、プラグインの初期化時に、setterメソッドを介して依存関係を注入するだけです。

public void onLoad() throws Exception {
    StaticApi.setImpl(new MyCustomStaticApiImpl());
}

私の質問は:これはそれを行う正しい方法ですか?このようなケースに特化した、聞いたことのないデザインパターンはあるのでしょうか。

4

2 に答える 2

2

サードパーティの開発者にとって最善の解決策は、Proxyパターンを使用することです。

http://en.wikipedia.org/wiki/Proxy_pattern

実装オブジェクトをインスタンスとして設定することは、優れたソリューションではありません。

于 2013-03-24T14:27:46.403 に答える
2

ここで設定しているのは、ファクトリが返す実装をクライアントが構成できるファクトリパターンです。それは問題ありませんが、別の方法で行う必要があることがいくつかあります。

  1. 名前をに変更StaticApiStaticApiFactoryます。これにより、その役割がより明確になり、次の部分との名前の競合が回避されます。
  2. メソッドを削除しpublic static void doSomething()ます。すべてのAPIメソッドを静的メソッドとして再定義する必要はありません。これはファクトリクラスであるため、代わりに必要なのは、現在の実装を取得するメソッドです。たとえば、public static StaticApi getInstance()を介して設定された実装を返すメソッドですsetImpl()
  3. StaticApiAPI動作のコントラクトを定義するインターフェースを作成します。ファクトリクラスは、クライアントができるようにする必要がありますsetImpl(StaticApi)
  4. これで、StaticApiを使用する必要がある人は誰でも、を介して参照を取得できますStaticApiFactory.getInstance()
于 2013-03-24T14:45:24.210 に答える