2010-12-06 2 views
10

J'ai une usine très simple qui prend un Enum comme l'un de ses paramètres pour déterminer le type d'objet qui doit être créé, et un autre paramètre qui est commun à tous les objets créés .Utilisation du modèle d'usine pour les classes avec des paramètres différents

Comme je l'ajout de types pour l'usine pour créer mes paramètres de constructeur d'objets commencent à différer, par exemple:

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

Dois-je pas utiliser une usine et juste instancier les différents types avec la bons arguments ou est-ce que ce qui précède peut être amélioré d'une manière ou d'une autre pour le rendre plus flexible?

+1

Vous pouvez supprimer Enum et utiliser des méthodes différentes à la place? –

Répondre

1

Je voudrais créer une interface qui ressemble à

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

Vous pouvez avoir une classe d'usine qui contient une liste de trois de ces IFactories pour créer, supprimer et éditer et peut interroger la liste de ces usines pour le premier qui répond vrai à la méthode AppliesTo.

+0

pas 'bool's sont ici :) – khachik

+1

Lol, mon java est un peu rouillé – Vadim

3

La chose Java standard à faire est d'ajouter une méthode à l'énumération.

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

Comme le souligne @Stas Kurilin sur, si vous pouvez éviter le ENUM et juste appeler des méthodes statiques de création de noms et paramètres appropriés, alors vous résoudre de nombreux problèmes.

(Quelques autres points aléatoires: il est généralement préférable de jeter une exception que d'accepter une valeur null ou inconnue Essayez d'utiliser le typage fort plutôt que Object Stick avec les conventions de codage Java, telles que les noms de type majuscule...)

0

Créer une interface avec la signature suivante,

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

} 

et laissez d'autres objets à mettre en œuvre cette interface. Alors que la création reste avec l'objet. Le modèle d'usine est bon. Mais, puisque vous utilisez des énumérations pour identifier le type, il serait préférable d'utiliser le polymorphisme, de sorte qu'il devienne maintenable.

Questions connexes