【问题标题】:Using enum as factory vs static factory method使用枚举作为工厂与静态工厂方法
【发布时间】:2017-02-16 10:58:49
【问题描述】:

早安,

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

项目中的标准做法是使用静态工厂方法。

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;
    }
}

通过查看代码,我可以看到构造函数是私有的,而类是最终的。该类不能被实例化或扩展,即new 或extends

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

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 和单例模式。

对我来说,这两种实现没有区别,我宁愿选择更简洁的一种,即不需要编写额外的访问修饰符

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

【问题讨论】:

    标签: java enums singleton


    【解决方案1】:

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

    优点:没有final和private构造函数。

    缺点: enum 的调用比原来的方法长。也就是说,现在我们写CustomerFactory.CREATE.form(userDetail),但原来的方式,我们只是写CustomerFactory.form(userDetail)。所以,原来的方式要更简洁和更容易理解。

    我更喜欢使用原始方式。

    【讨论】:

    • 在实现之前做了一点研究,发现stackoverflow问题:stackoverflow.com/questions/23721115/…
    • @Rentius2407 是的,我们通常将枚举用于单例模式。在您的问题中,您说将枚举用于工厂模式,而不是单例模式。工厂模式会为每个工厂方法调用创建不同的对象,因为枚举模式总是会得到相同的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多