4

私は多くの場所を検索してきましたが、私の問題に対する良い答えが見つかりませんでした:

たとえば、列挙型があります。

public enum Window { CLASSIC, MODERN }

次のように、列挙値に従ってアプリケーションの動作を分離する必要があります。

switch (myWindow.getType()) {
  case CLASSIC: new ClassicWindow(...);
  case MODERN: new ModernWindow(...);
}

私はあなたの考えを知っています:単にそれを列挙型とバスタに入れますが、これは私の列挙型に依存する唯一のクラスではありません! そして、オブジェクトの数だけオブジェクト作成メソッドを書くことはできません!

簡単に言えば、この状況で何ができるでしょうか?私の友人は、列挙型を取り除き、派生クラスを毎回使用するように私に言いましたが、最終的には、すべてのテストのサブクラスと同じ数のインスタンスを作成する必要があります!

要するに、私は立ち往生しています。

そのためのベストプラクティスを知っていますか? ありがとう

4

3 に答える 3

2

列挙型を使用するための優れたプラクティスではなく、デザイン パターンを探しているようです。記述しようとしているコードは、列挙型の可能な値ごとに 1 つの条件を持つ switch ステートメントでいっぱいになるため、長期的には保守と拡張が難しくなります。より良いアイデアは、 Abstract Factoryパターンを使用して、考えられる各ケースの動作を別のクラスでリファクタリングすることです。

于 2013-02-12T13:57:16.683 に答える
0

これがファクトリパターンです。 この例は、実際にあなたがしていることを正確に示しています。

于 2013-02-12T13:58:08.717 に答える
0

列挙型にインターフェイスを実装し、それらをファクトリとして機能させることができます。

interface WindowBuilder {
    Window makeWindow();
}

enum WindowType implements WindowBuilder {
    SIMPLE {
        public Window makeWindow() { return new SimpleWindow() }
    },
    [... other enums]
}

または、リフレクションを使用してクラスを列挙型にバインドし、(再び) ファクトリとして機能させることができます。

enum WindowType {
    SIMPLE(SimpleWindow.class),
    [... other enums]

    private final Class<? extends Window> wndType;

    private WindowType(Class<? extends Window> wndType) {
        this.wndType = wndType;
    }

    public Window makeWindow() {
        // in fact you will need to either catch the exceptions newInstance can throw, or declare the method can throw them
        return this.wndType.newInstance();
    }
}

どちらの方法でも、後でそのように呼び出すことができます。

Window window = myWindow.getType().makeWindow();
于 2013-02-12T14:03:16.433 に答える