使用枚举作为工厂与静态工厂方法

时间:2017-02-16 10:58:49

标签: java enums singleton

美好的一天,

我已将对象创建提取到工厂中。

在项目中执行此操作的标准方法是使用静态工厂方法。

public final class CustomerFactory {

    private CustomerFactory(){}

    public static Customer valueOf(Detail detail) {

        Customer customer = new Customer();

        String name = detail.getName();
        customer.setName(name);
        String lastname = detail.getLastname();
        customer.setLastname(lastname);
        customer.setFullname(name + " " + lastname);

        Date age = detail.getAge();
        customer.setAge(age);

        return customer;
    }
}

从查看代码,我可以看到构造函数是私有的,类是final。该类无法实例化或扩展,即newextends

我决定制作一个同样的枚举工厂。为什么?一个人不能扩展它,不需要最终的类级别,也不需要私有构造函数。

public enum CustomerFactory {

    INSTANCE;

    public Customer from(Detail detail) {

        Customer customer = new Customer();

        String name = detail.getName();
        customer.setName(name);
        String lastname = detail.getLastname();
        customer.setLastname(lastname);
        customer.setFullname(name + " " + lastname);

        Date age = detail.getAge();
        customer.setAge(age);

        return customer;
    }
}

经过同行审核后,我们决定将其归还原文,因为它错误地使用了enum和单身模式。

对我来说两个实现之间没有区别,我宁愿选择一个更干净的实现,即不需要编写额外的访问修饰符

以下是枚举的误用,因为它只用于常量吗?

1 个答案:

答案 0 :(得分:0)

在我看来,如果一个解决方案能够实现其目标,那么这不是滥用,但它可能不是最佳实践。说实话,这是我第一次看到使用枚举作为工厂模式。就像你的同行所说,枚举通常用于分组常量或用于单例模式。使用枚举时:

优势:没有final且没有private构造函数。

Disadcantage:枚举的调用比原始方式更长。也就是说,现在我们写CustomerFactory.CREATE.form(userDetail),但是按照原始方式,我们只写CustomerFactory.form(userDetail)。所以,最初的方式是更清洁更容易理解

我宁愿使用原始方式。