2010-12-06 59 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); 

} 

,並讓其他對象實現此接口。因此,創造仍然與對象。工廠模式很好。但是,由於您使用枚舉來標識類型,因此使用多態性會更好,因此它可以維護。