使用枚举作为工厂vs静态工厂方法
问题描述:
美好的一天,使用枚举作为工厂vs静态工厂方法
我已经提取了我的对象创建到工厂。
在项目中执行此操作的标准方法是使用静态工厂方法。
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
我决定做一个枚举工厂。为什么?不能扩展它,不需要最终的类级别,也不需要私有构造函数。
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
也是Singleton模式的审查。
对我来说有两种实现之间没有区别,我宁愿选择一个是即无需清洁编写额外的访问修饰符
是A枚举的误用下面,因为它仅仅是为了用于常量?
答
在我看来,如果一个解决方案可以实现其目标,这不是一个误用,但它可能不是最佳实践。说实话,这是我第一次看到使用枚举作为工厂模式。就像你的同伴说的那样,枚举通常用于分组常量或用于单例模式。使用枚举时:
优点:没有final
和没有private
的构造函数。
不利原因:枚举的调用比原来的方式更长。也就是说,现在我们写CustomerFactory.CREATE.form(userDetail)
,但以原来的方式,我们只写CustomerFactory.form(userDetail)
。所以,原来的方式很多清洁剂和更容易理解。
我宁愿使用原来的方式。
我在实现之前做了一些研究,发现了stackoverflow问题:http://stackoverflow.com/questions/23721115/singleton-pattern-using-enum-version – Rentius2407
@ Rentius2407是的,我们通常使用enum for singleton模式。在你的问题中,你说使用枚举工厂模式,而不是单身模式。工厂模式将为每个工厂方法调用创建不同的objs,因为枚举模式将始终获得相同的obj。 – kissrain