2010-12-06 117 views
10

我有一个非常简单的工厂,它将Enum作为其参数之一来确定应创建的对象的类型以及所有正在创建的对象共有的其他参数。对具有不同参数的类使用工厂模式

,因为我加入了更多类型的工厂创建我的对象构造函数的参数也开始不同,例如:

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

如果我不使用一个工厂,只是实例化的不同类型与正确的论点还是可以通过某种方式改进上述内容以使其更加灵活?

+1

您可以删除枚举并改用其他方法吗? – 2010-12-06 20:58:42

回答

1

我会创建一个看起来界面像

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

然后,您可以有一个包含这三个IFactories用于创建,删除的列表工厂类和编辑,可以查询这些工厂列表对于第一个响应AppliesTo方法的实例而言。

+0

no`bool`s here :) – khachik 2010-12-06 21:09:20

3

要做的标准Java事情是向枚举中添加一个方法。

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

由于@Stas Kurilin所指出的,如果你能避免枚举并调用适当的名称和参数静态创建方法,那么你解决很多问题。

(其他一些随机点:这是一般更好地抛出比接受null或未知值异常尝​​试使用强类型,而不是Object与Java编码约定,如资本类型名称坚持。)

0

创建界面具有以下签名,

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

} 

,并让其他对象实现此接口。因此,创造仍然与对象。工厂模式很好。但是,由于您使用枚举来标识类型,因此使用多态性会更好,因此它可以维护。