代码之家  ›  专栏  ›  技术社区  ›  Steve

枚举工厂样式方法

  •  11
  • Steve  · 技术社区  · 15 年前

    在我的应用程序中,可以生成几个不同的报告(csv、html等)。

    我没有创建传统的工厂风格的方法模式,而是计划向枚举常量体添加一个方法,该方法将创建并返回适当的报表对象。

    public enum ReportType {
     CSV {
      @Override
      public Report create() {
       return new CSVReport();
      }
     },
     HTML {
      @Override
      public Report create() {
       return new HTMLReport();
      }
     };
    
     public abstract Report create();
    }
    

    使用指定的reporttype枚举常量,然后我可以通过执行如下语句轻松创建新报表:

    ReportType.CSV.create()
    

    我想得到其他人对使用这种方法的意见。你觉得这个怎么样?你喜欢其他的方法吗?如果是,为什么?

    谢谢

    4 回复  |  直到 13 年前
        1
  •  4
  •   Lucas de Oliveira    15 年前

    我认为这两种方法都可以,但是如果您不想知道正在生成哪种类型的报告,那么我相信枚举方法是最好的。就像这样:

    public class Person { 
        private String name;
        private ReportType myPreferedReportType;
    
        public ReportType getMyPreferedReportType(){
            return this.myPreferedReportType;
        }
        //other getters & setters...
    }
    

    supose您在数据库中持久化一个Person实例,稍后再检索它——如果您使用poli吗啡,则不需要任何开关wathsoever。你唯一需要做的就是 调用create()方法。像:

    Person person = null; 
    //... retrieve the person instance from database and generate a 
    //report with his/her prefered report type...
    Report report = person.getReportType.create();
    

    因此,如果您依赖于polimorphism,则不需要请求工厂显式地获取cvs/html/pdf,而将工作留给枚举本身。但是,当然,有些情况下您可能需要使用一个或另一个,尽管我倾向于定期使用枚举方法。

        2
  •  3
  •   sateesh    15 年前

    使用枚举(例如报表创建)可以获得什么好处?如果您有工厂方法,那么您将创建一个csvreport实例(比如说),如下所示:

    report csvreport=reportFactory.createCsvreport();
    

    我认为它比枚举更能传达意图。据我所知,枚举表示一组固定的常量,并将其用作工厂,例如创建(尽管Works)在我看来似乎滥用了枚举的意图。

    使用枚举(例如报表创建)所获得的优势是什么?如果您有工厂方法,那么您将创建一个csvreport实例(比如说),如下所示:

    Report csvReport = ReportFactory.createCSVReport();
    

    我认为它比枚举更能传达意图。据我所知,枚举表示一组固定的常量,并将其用作工厂,例如创建(尽管有效)在我看来似乎滥用了枚举的意图。

        3
  •  2
  •   Community CDub    8 年前

    看看 Enum with Visitor Pattern . 使用这种方法,您将能够动态地向枚举添加功能,而不必污染枚举本身。

        4
  •  1
  •   Greg    15 年前

    Joshua Bloch(公认的Java专家)实际上在他的书《第17页的有效Java第二版》中推荐了这种方法:用私有来强制SuntLon属性 构造函数或枚举类型。