枚举与工厂模式

我有两种解决方案,可以通过枚举类型创建新实例。

两者都能工作,但是我应该选择哪一个?为什么?

版本1:

public enum ColorName {
    Red(ColorRed.class),Green(ColorGreen.class),Blue(ColorBlue.class),ColorName(Class<?> clazz) {
        this.clazz = clazz;
    }

    private final Class<?> clazz;

    public Class<?> getclazz() {
        return clazz;
    }

    public Color createColor(String name) {

        Color c = null;

        try {
            c = (Color) this.clazz.getconstructor(String.class).newInstance(name);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return c;
    }
}

版本2:

public enum ColorName {
    Red{
        @Override
        public Color newInstance(String name) {
            return new ColorRed(name);
        }
    },Green{
        @Override
        public Color newInstance(String name) {
            return new ColorGreen(name);
        }
    },Blue{
        @Override
        public Color newInstance(String name) {
            return new ColorBlue(name);
        }
    };

    public abstract Color createColor(String name);
}

我认为第2版更好(而且可能更快,键入安全,无反射,无需try..catch)。

版本1 的唯一好处:代码更小(每个枚举只有一个工厂方法,而不是一个构造函数)。

使用版本1 代替版本2 还有其他好处吗?

还有更好的选择吗?也许使用Supplier

Bactryki 回答:枚举与工厂模式

Java 8功能方法:

public enum Color {

    RED(text -> new RedColor(text));
    BLUE(text -> new BlueColor(text));

    Function<String,Color> function;

    Color(Function function) {
        this.function = function;
    }

    Color getColor(String text) {
        return function.apply(text);
    }
}

我觉得这是实现目标的“最短”方法。

本文链接:https://www.f2er.com/3149306.html

大家都在问