工厂实现与枚举

时间:2016-06-09 09:21:27

标签: java

我遵循Java工厂模式为我正在创建的报告定义不同的PDF模板。

Template
TemplateFactory
Example1Template
Example2Template

在具体类Example1Template和Example2Template中,我需要有一个包含在PDF模板中的页面集合,这些页面对于每个实现都是不同的。目前我有一个值为的HashMap:

    private static final Map<String,Integer> PAGES;
    static
    {
        PAGES = new HashMap<>();
        PAGES.put("COVER", 1);
        PAGES.put("DEFAULT", 2);
        PAGES.put("PAGE_TYPE_1", 3);
        PAGES.put("PAGE_TYPE_2", 4);
        PAGES.put("PAGE_TYPE_3", 5);
    }

理想情况下,我喜欢使用类似枚举的东西,我可以从类型安全和有限的输入中受益,而不仅仅是使用字符串键,但我努力让它发挥作用。

编辑: 在Factory模式的上下文中实现这一目标的最佳方法是什么?

Template template = TemplateFactory.get(TemplateType.CORPORATE);

然后我可以更改我的代码以使用我正在使用的template.PAGES.COVER&#34; COVER&#34;使用HashMap指定页面。这是我无法使用Factory模式的部分。

3 个答案:

答案 0 :(得分:0)

Java枚举最终......只是特殊版本的类。这意味着您可以使用自定义构造函数,例如:

public enum Whatever {
   Bar(1), Foo(2);

   private final int whoCares;
   private Whatever(int value) { whoCares = value;  }

   public int getValue() { return whoCares; }

当然,有趣的部分可能是......迟早你需要多个这样的枚举 - 所有枚举都带有相同的枚举实例名称,但提供对不同属性的访问。

答案 1 :(得分:0)

使用有价值的枚举(该值在私有构造函数中设置,因此无法更改):

public enum Pages {
    COVER(1), 
    DEFAULT(2);

    private final int value;
    Pages(int value) { this.value = value; }
    public int getValue() { return value; }
}

答案 2 :(得分:0)

以下是使用Enum实现使用Map与实现的实现的快速演示:

public class TestEnum {

    public enum PAGES {

        COVER(1),
        DEFAULT(2),
        PAGE_TYPE_1(3),
        PAGE_TYPE_2(4),
        PAGE_TYPE_3(5);

        public final int value;
        PAGES(int value) {
            this.value = value;
        }
    }

    private static final Map<String,Integer> pages;
        static
        {
            pages = new HashMap<>();
            pages.put("COVER", 1);
            pages.put("DEFAULT", 2);
            pages.put("PAGE_TYPE_1", 3);
            pages.put("PAGE_TYPE_2", 4);
            pages.put("PAGE_TYPE_3", 5);
        }


        public static void main(String[] args) {

            for ( PAGES page : PAGES.values()) {

                System.out.println("Enum value is "+ page.value  + "    Map vlaue is "+ pages.get(page.name()));
            }
        }
}

打印输出为:

枚举值为1地图值为1
枚举值为2地图值为2
枚举值为3地图值为3
枚举值为4地图值为4
枚举值为5地图值为5