2013-10-13 167 views
1

我有一個非常典型的問題。在我的應用程序,我有以下代碼:具有不同參數的java類作爲方法的參數

public TaskListDatabases getTaskListDatabases (int mode) { 
    switch (mode) { 
     case (MODE_NORMAL): 
      if (taskListDatabases == null) { 
       taskListDatabases = new TaskListDatabases(app); // 1st place 
      } 
      break; 
     case (MODE_FORCE_RERUN): 
      if (taskListDatabases == null) { 
       taskListDatabases = new TaskListDatabases(app); // 2nd place 
      } else { 
       if (taskListDatabases.getStatus() == AsyncTask.Status.FINISHED) 
        taskListDatabases = new TaskListDatabases(app); // 3rd place 
      } 
      break; 
    } 
    return taskListDatabases; 
} 

現在我想創建4種相似但在實際的對象構造的地方(標有註釋)不同的另外一個功能。

在1日,而不是new TaskListDatabases(app)我想有new Task (app, int, int),在第二new Task (app, String, int),在第三new Task (app, String, String, String) ....

其餘全部是相同的。我想知道是否有機會創建一個函數作爲「參數」部分new TaskListDatabases(app)。如果只是階級問題,那就不是問題,因爲我會擁有「階級參議員」。但是,這裏每個類也有不同的構造函數參數。

有什麼想法?

+2

谷歌爲「工廠」模式。 – Dirk

+0

爲什麼不將TaskListDatabases的實例作爲參數? – mash

+0

看看這些[[1](http://www.youtube.com/watch?v=ub0DXaeV6hA)] [[2](http://www.youtube.com/watch?v=xbjAsdAK4xQ)] –

回答

0

你想要的是一個abstract factory實施爲anonymouscallback後面的facade。困惑?希望將不會在這之後:

定義的接口爲匿名回調:

private interface TaskFactory { 
    Task create(); 
} 

重構基方法使用工廠

private Task getTask (int mode, TaskFactory factory) { 
    switch (mode) { 
     case MODE_NORMAL: 
      if (taskListDatabases == null) { 
       taskListDatabases = factory.create(); 
      } 
      break; 
     case (MODE_FORCE_RERUN): 
      if (taskListDatabases == null) { 
       taskListDatabases = factory.create(); 
      } else { 
       if (taskListDatabases.getStatus() == AsyncTask.Status.FINISHED) 
        taskListDatabases = factory.create(); 
      } 
      break; 
    } 
    return taskListDatabases; 
} 

然後,創建用於每個目的門面的方法:

public Task getTaskListDatabases(int mode) { 
    return getTask(mode, 
     new TaskFactory() { 
      Task create() { 
       return new TaskListDatabases(app); 
      } 
     } 
    } 
} 

public Task getTaskOther(int mode) { 
    return getTask(mode, 
     new TaskFactory() { 
      Task create() { 
       return new Task(app, "foo", 7; // eg 
      } 
     } 
    } 
} 

// etc for other Task flavours 
+0

這似乎是相當複雜的。我必須分析,但在我的情況下,公共任務getTaskOther方法將有更多的參數ex。(int,String,String),它將被轉移到新的任務構造函數。確定它將如何影響AbstractFactory。 – user2707175

+0

谷歌的「價值對象」,並使用其中一些字段設置爲null更簡單的情況下 – Bohemian

相關問題