28

Java を使用すると、Enum にデータと動作を埋め込むことができます。これはその役割ではないと思うので、列挙型に直接ファクトリを実装したくありません。

しかし、列挙型にクラス参照を配置し、外部ファクトリにオブジェクトを構築できます。従来のファクトリ パターンと比較して、あなたにとって最適な実装は何ですか? どの場合にどのソリューションを使用するのが良いですか?

さて、コードです。

オブジェクトを構築するために両方のソリューションで使用される関数。必要に応じて Map を使用して fly-weight パターンを実装するのに便利です。

private Action getAction(Class<? extends Action> actionClazz) {
    // logger + error handling
    return actionClazz.newInstance();
}

1) 伝統的な工場で:

public enum ActionEnum {
    LOAD_DATA,
    LOAD_CONFIG;
}

public Action getAction(ActionEnum action) {
    switch (action) {
    case LOAD_CONFIG:
        return getAction(ActionLoadConfig.class);
    case LOAD_DATA:
        return getAction(ActionLoadData.class);
    }
}

2) Enum スタイルのファクトリを使用する場合:

public enum ActionEnum {
    LOAD_DATA(ActionLoadConfig.class),
    LOAD_CONFIG(ActionLoadData.class);

    public ActionEnum(Class<? extends Action> clazz){...}
    public Class<? extends Action> getClazz() {return this.clazz}
}

public Action getAction(ActionEnum action) {
    return getAction(action.getClazz());
}
4

4 に答える 4

17

これは私にとってはうまくいきます:

 enum ActionEnum
    {
      LOAD_DATA {

        @Override
        public ActionLoadData getInstance() {
            return new ActionLoadData ();
        }

    },
    LOAD_CONFIG {

        @Override
        public ActionLoadConfig getInstance() {
            return new ActionLoadConfig();
        }

    };

    public abstract ILightBulb getInstance();
}

class ActionFactory
{
    public  Action getAction(ActionEnum action)
    {
       return action.getInstance();
    }
}
于 2016-12-22T11:10:30.747 に答える
7

さらに分離するには:

static final EnumMap<ActionEnum, Class<? extends Action>> enumToClass = new EnumMap<>();
static
{  
    enumToClass.put(ActionEnum.LOAD_DATA, ActionLoadData.class);
    etc...
}


public Action getAction(ActionEnum action) 
{
    return getAction(enumToClass.get(action));
}

EnumMapとても速いので心配いりません。

于 2013-07-10T23:21:49.207 に答える