java - 枚举工厂式方法

标签 java enums factory

在我的应用程序中,可以生成多个不同的报告(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()

我想了解其他人对使用这种方法的意见。你觉得这怎么样?您是否更喜欢任何其他方法,如果是,为什么?

谢谢

最佳答案

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

public class Person { 
    private String name;
    private ReportType myPreferedReportType;

    public ReportType getMyPreferedReportType(){
        return this.myPreferedReportType;
    }
    //other getters & setters...
}

假设您将一个 Person 实例保存在数据库中并稍后检索它 - 如果您使用多态性,您将不需要任何开关。你唯一需要做的就是 调用 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();

因此,如果您依赖多态性,则无需要求工厂明确地为您提供 CVS/HTML/PDF,将这项工作留给 Enum 本身。但是,当然,有些情况下您可能需要使用一种或另一种方法,尽管我倾向于经常使用枚举方法。

关于java - 枚举工厂式方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2163414/

相关文章:

python - 如何测试抽象工厂

java - 生成累积频率数但从 0 开始

java - 将 JPanel 设置为另一个类的新 JPanel

c# - C# 中的枚举 - 赋值

java - 使用枚举静态变量创建了多少个副本

c# - Connectionstring 没有从 dbconnection 传递到 dbfactory?

java - 无法使用 IntelliJ 从 github 拉取项目

java - 有没有办法让Java中的数组真正私有(private)?

powershell - 如何将整数强制转换为 PowerShell 中的枚举类型?

javascript - 防止第三方工厂干扰我的应用程序的同名工厂