2010-12-06 4 views
10

Ich habe eine sehr einfache Factory, die einen Enum als einen ihrer Parameter verwendet, um den Typ des zu erstellenden Objekts und einen anderen Parameter zu bestimmen, der allen erstellten Objekten gemeinsam ist .Verwenden des Factory-Patterns für Klassen mit unterschiedlichen Parametern

Wie ich mehr Arten für die Fabrik das Hinzufügen meines Objektkonstruktor-Parameter zu erstellen beginnen zu unterscheiden, zB:

public class someFactory { 
    public someFactory() { 
    } 

    public SomeObject newObject(Type type, Object data) { 
     return this.newObject(type, data, ""); 
    } 

    public SomeObject newObject(Type type, Object data, Object stringOrObject) { 
     SomeObject someObject = null; 

     if (type != null) { 
      switch(type) { 
       case CREATE: 
        someObject = new CreateObject(data); 
        break; 
       case DELETE: 
        someObject = new DeleteObject(data, (String)stringOrObject); 
        break; 
       case EDIT: 
        someObject = new EditObject(data, (Object)stringOrObject); 
        break; 
       default: 
        break; 
      } 
     } 

     return someObject; 
    } 
} 

Sollte ich nicht eine Fabrik verwenden und nur die die verschiedenen Arten mit der instanziiert richtige Argumente oder kann das Obige irgendwie verbessert werden, um es flexibler zu machen?

+1

Sie können Enum entfernen und stattdessen andere Methoden verwenden? –

Antwort

1

würde ich eine Schnittstelle erstellen, die

public interface IFactory 
{ 
    SomeObject Create(Object data, String orObject); 
    Boolean AppliesTo(Type type); 
} 

Sie können wie

sieht dann eine Factory-Klasse, die für Erstellen Sie eine Liste von drei dieser IFactories enthält, Löschen und Bearbeiten und die Liste dieser Fabriken abfragen für die erste, die der AppliesTo-Methode entspricht.

+0

keine 'Bool's sind hier :) – khachik

+1

Lol, mein Java ist ein bisschen rostig – Vadim

3

Das Java-Standardverfahren besteht darin, der Enumeration eine Methode hinzuzufügen.

public enum Type { 
    CREATE() { 
     public SomeObject create(Object data, Object stringOrObject) { 
      return new CreateObject(data); 
     } 
    }, 
    [...]; 
    public SomeObject create(Object data) { 
     return create(data, ""); 
    } 
    public abstract SomeObject create(Object data, Object stringOrObject); 
} 

Wie @Stas Kurilin weist darauf hin, wenn Sie die Enum vermeiden und rufen nur statische Methoden zum Erstellen von entsprechenden Namen und Parameter Sie dann viele Probleme lösen.

(Einige andere zufällige Punkte: Es ist im Allgemeinen besser, eine Ausnahme zu werfen als einen null oder unbekannten Wert annehmen Versuchen eher starke Typisierung zu verwenden, als Object Stick mit den Java-Codierung Konventionen, wie aktivierte Typnamen...)

0

erstellen Sie eine Schnittstelle mit der folgenden Signatur,

public interface IFactory 
{ 
    GenricType Create(object data, string orObject); 

} 

und lassen Sie andere Objekte diese Schnittstelle implementieren. Damit bleibt die Schöpfung beim Objekt. Fabrikmuster ist gut. Da Sie jedoch Enums verwenden, um den Typ zu identifizieren, wäre es besser, Polymorphismus zu verwenden, damit er wartbar wird.

Verwandte Themen