3

1 つの情報に基づいて異なるクラス タイプを使用するアプリケーションを開発しています。私の質問をよりよく説明するために、例を挙げましょう。

INFOはブール値であると仮定します。その値に基づいて、コードは一部のクラスAまたは一部のクラスのインスタンスを使用する必要がありますB。for everyはそのサブクラスAであることに注意してください。アプリケーションの起動時に設定され、アプリのライフサイクルを通じて変更されません。BINFO

私の質問:これを実装する最適な方法は何ですか?

ここに私が思いついたいくつかのアプローチがありますが、他のアプローチを自由に提案してください。

1. メソッドを持つファクトリ クラス:

public static A getA(final boolean INFO) {
    return INFO ? new A() : new B();
}

2. ラッパー クラス:

class WrapperForSomeClass {

    public final A instance;

    public WrapperForSomeClass(final boolean INFO) {
        instance = INFO ? new A() : new B();
    }

}

3. インターフェイス + ファクトリ クラス:

public interface IWrappable<T> {
    T get(final boolean INFO);
}

private static final IWrappable<A> WRAPPER_FOR_A = new IWrappable<A>() {
    public A get(final boolean INFO) {
        return INFO ? new A() : new B();
    }
};

public static A getA(final boolean INFO) {
    return WRAPPER_FOR_A.get(INFO);
}

どちらかを選ばなければならないとしたら、私はNo.3を選びます。何て言う?

4

2 に答える 2

0

私は次のようにします:

class A
{
}

class B extends A
{
}

class AFactory
{
    public A getInstance(boolean info) 
    {
        return info ? new A() : new B();
    }
}

class MyMainLauncher
{
    private AFactory aFactory;
    private A instance;

    {
        // has access to the boolean value `info`.
        instance = aFactory.getInstance(info);
    }
}
于 2012-09-19T09:48:52.553 に答える
0

1 は最短で最もクリーンです。冗長なファクトリ クラスを作成しないように、このメソッドを A クラスに配置します。

なぜあなたは3に行くのですか?同じことを行いますが、より多くのコードが必要です。

于 2012-09-19T10:18:24.073 に答える