Enum Factory Pattern

Androidでカメラアプリを作っていて、画像に対するフィルタを設定値からインスタンス生成して適用したい。
そこでFactory patternでやっていたのですが、Enum factory patternというのを見つけて、こっちの方が全然シンプルだし柔軟そう!と思い書き換えてみました。

package com.cheesepie.filter;
    public enum Filters {
        MONOTONE ("monotone"),
        SEPIA ("sepia"),
        DEFAULT ("default");

        private Filters(String name) {
            this.name = name;
        }

        public String toString() {
            return name;
        }

        public IFilter get() {
            switch (this) {
            case MONOTONE:
                return new MonotoneFilter();
            case SEPIA:
                return new SepiaFilter();
            case DEFAULT:
            default:
                return new DefaultFilter();
            }
        }

        private String name;
    }
}

IFilterは各フィルタで実装しているインターフェース。

使う側はこんな感じ。

// Get preference
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(uiActivity);
String filterPreference = sharedPreferences.getString("filter", uiView.DEFAULT_FILTER);
// Set filter
IFilter filter = EnumUtil.valueOf(Filters, filterPreference);
synchronized (objLock) {
    return filter.doFilter(sourceBmp);
}

EnumUtilは自作のユーティリティで、数も多くないのでfor文でEnumをなめて返している。
フィルタを追加するときは、Filters.javaに2行追加するだけ。
これでだいぶシンプルに書けるようになった。