美好的一天,
我已将对象创建提取到工厂中。
在项目中执行此操作的标准方法是使用静态工厂方法。
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。该类无法实例化或扩展,即new
或extends
我决定制作一个同样的枚举工厂。为什么?一个人不能扩展它,不需要最终的类级别,也不需要私有构造函数。
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
和单身模式。
对我来说两个实现之间没有区别,我宁愿选择一个更干净的实现,即不需要编写额外的访问修饰符
以下是枚举的误用,因为它只用于常量吗?
答案 0 :(得分:0)
在我看来,如果一个解决方案能够实现其目标,那么这不是滥用,但它可能不是最佳实践。说实话,这是我第一次看到使用枚举作为工厂模式。就像你的同行所说,枚举通常用于分组常量或用于单例模式。使用枚举时:
优势:没有final
且没有private
构造函数。
Disadcantage:枚举的调用比原始方式更长。也就是说,现在我们写CustomerFactory.CREATE.form(userDetail)
,但是按照原始方式,我们只写CustomerFactory.form(userDetail)
。所以,最初的方式是更清洁和更容易理解。
我宁愿使用原始方式。