2010-12-06 6 views
10

Tengo una fábrica muy simple que toma un Enum como uno de sus parámetros para determinar el tipo de objeto que se debe crear, y otro parámetro que es común a todos los objetos que se crean .Usando el patrón de fábrica para las clases con diferentes parámetros

Como estoy añadiendo más tipos de la fábrica para crear parámetros de mi objeto de constructores están empezando a ser diferentes, por ejemplo:

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

¿No debería estar usando una fábrica y solo una instancia del los diferentes tipos con el argumentos correctos o ¿se puede mejorar lo anterior de alguna manera para hacerlo más flexible?

+1

¿Puede eliminar Enum y usar métodos diferentes en su lugar? –

Respuesta

1

me gustaría crear una interfaz que se parece a

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

A continuación, puede tener una clase de fábrica que contiene una lista de tres de estos IFactories para crear, eliminar, y editar y se puede consultar la lista de estas fábricas para el primero que responde fiel al método AppliesTo.

+0

no 'bool's están aquí :) – khachik

+1

jaja, mi java está un poco oxidada – Vadim

3

La cosa estándar de Java es agregar un método a la enumeración.

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

Como @Stas Kurilin señala, si se puede evitar la enumeración y simplemente llamar a los métodos de creación estáticos de nombres y parámetros adecuados, a continuación, a resolver muchos problemas.

(Algunos otros puntos al azar: Por lo general es mejor que lanzar una excepción de aceptar un valor desconocido null o tratar de utilizar una gran escritura en lugar de Object Stick con las convenciones de codificación Java, como nombres de tipos de bienes de uso...)

0

crear una interfaz con la siguiente firma,

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

} 

y dejar que otros objetos implementan esta interfaz. Para que la creación permanezca con el objeto. Patrón de fábrica es bueno. Pero, dado que está utilizando enumeraciones para identificar el tipo, sería mejor utilizar el polimorfismo para que pueda mantenerse.

Cuestiones relacionadas