2017-02-16 12 views
-2

Добрый день,Использование перечисления как заводского и статического заводского метода

Я извлек создание своего объекта на заводе.

Стандартный способ сделать это в проекте - использовать статический заводский метод.

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

Я решил сделать фабрику enum, которая делает то же самое. Зачем? Нельзя расширять его, нет необходимости в финале на уровне класса и не нужно иметь частный конструктор.

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

На мой взгляд, если одно решение может достичь своей цели, это не злоупотребление, но это может быть не самая лучшая практика. Честно говоря, это первый раз, когда я вижу использование enum в качестве заводского шаблона. Как и ваш сверстник, перечисление обычно используется для группировки констант или используется для одноэлементного рисунка. При использовании перечисления:

Преимущество: нет final и не имеет private конструктор.

Disadcantage: вызов перечислителя длиннее оригинального. То есть, теперь мы пишем CustomerFactory.CREATE.form(userDetail), но в оригинальном виде мы просто пишем CustomerFactory.form(userDetail). Таким образом, оригинальным способом является много очиститель и понятный.

Я предпочел бы использовать оригинальный способ.

+0

Я сделал несколько исследований перед реализацией, нашел вопрос о стеке: http://stackoverflow.com/questions/23721115/singleton-pattern-using-enum-version – Rentius2407

+0

@ Rentius2407 Да, мы обычно используем перечисление для singleton шаблон. В вашем вопросе вы сказали, используя enum для заводского шаблона, а не singleton pattern. Заводская модель создаст различные объекты с каждым вызовом метода фабрики, поскольку шаблон перечисления всегда будет иметь тот же объект. – kissrain