2017-02-16 2 views
-2

Guten Tag,Verwendung von Enum als Factory vs statische Fabrik Methode

Ich habe meine Objekt-Erstellung in eine Fabrik extrahiert.

Die Standardmethode im Projekt ist die Verwendung der statischen Fabrikmethode.

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

Von Blick auf den Code, kann ich der Konstruktor ist privat sehen und die Klasse ist endgültig. Die Klasse kann nicht das heißt new oder extends

instanziiert oder erweitert werden, beschloss ich, eine Enum-Fabrik zu machen, die das gleiche tut. Warum? Man kann es nicht erweitern, keine Notwendigkeit, auf Klassenebene endgültig zu sein und keinen privaten Konstruktor zu haben.

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

von einem Peer Bei der Überprüfung wurde beschlossen, dass es wieder in dem ursprünglichen gehen sollte, weil es die falsche Verwendung eines enum und auch Singletonmuster ist.

Für mich gibt es keinen Unterschied zwischen den beiden Implementierungen ist, würde ich eher das wählen, die sauberer, dh keine Notwendigkeit, zusätzliche Zugriffsmodifikatoren

Ist das unter einen Missbrauch eines Enum codieren, da es nur dazu bestimmt ist, für Konstanten verwendet werden?

Antwort

0

Meiner Meinung nach, wenn eine Lösung ihr Ziel erreichen könnte, ist es kein Missbrauch, aber es ist möglicherweise nicht die beste Praxis. Um ehrlich zu sein, ist es für mich das erste Mal, Enum als Fabrikmuster zu sehen. Wie Ihr Peer sagte, wird enum normalerweise zum Gruppieren von Konstanten verwendet oder für Singleton-Muster verwendet. Bei der Verwendung von ENUM:

Vorteil: keine final und keinen private Konstruktor.

Nachteil: der Aufruf von enum ist länger als ursprünglicher Weg. Das heißt, jetzt schreiben wir CustomerFactory.CREATE.form(userDetail), aber auf die ursprüngliche Art schreiben wir einfach CustomerFactory.form(userDetail). Also, der ursprüngliche Weg ist viel Reiniger und einfacher zu verstehen.

Ich würde lieber den ursprünglichen Weg verwenden.

+0

Ich habe ein wenig Forschung vor der Implementierung, fand die stackoverflow Frage: http://stackoverflow.com/questions/23721115/singleton-pattern-using-enum-version – Rentius2407

+0

@ Rentius2407 Ja, wir verwenden normalerweise Enum für Singleton Muster. In Ihrer Frage haben Sie gesagt, dass Sie enum für das Fabrikmuster verwenden, nicht für das Singleton-Muster. Das Factory-Muster erstellt bei jedem Factory-Methodenaufruf verschiedene Objs, da das Aufzählungsmuster immer dasselbe Obj erhält. – kissrain

Verwandte Themen