2017-02-16 127 views
-2

美好的一天,使用枚举作为工厂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; 
    } 
} 

从查看代码,我可以看到构造函数是私有的,而类是最终的。该类不能实例化或扩展,即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也是Singleton模式的审查。

对我来说有两种实现之间没有区别,我宁愿选择一个是即无需清洁编写额外的访问修饰符

是A枚举的误用下面,因为它仅仅是为了用于常量?

回答

0

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

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

不利原因:枚举的调用比原来的方式更长。也就是说,现在我们写CustomerFactory.CREATE.form(userDetail),但以原来的方式,我们只写CustomerFactory.form(userDetail)。所以,原来的方式很多清洁剂更容易理解

我宁愿使用原来的方式。

+0

我在实现之前做了一些研究,发现了stackoverflow问题:http://stackoverflow.com/questions/23721115/singleton-pattern-using-enum-version – Rentius2407

+0

@ Rentius2407是的,我们通常使用enum for singleton模式。在你的问题中,你说使用枚举工厂模式,而不是单身模式。工厂模式将为每个工厂方法调用创建不同的objs,因为枚举模式将始终获得相同的obj。 – kissrain