1

我有一个非常不典型的问题。在我的应用程序中,我有以下代码:

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)第 2 次new Task (app, String, int),在第 3 次new Task (app, String, String, String)......

其余的都是一样的。我想知道是否有机会创建一个作为“参数”的函数 part new TaskListDatabases(app)。如果只是班级问题,那将不是问题,因为我会有“班级参数”。然而,这里每个类也有不同的构造函数参数。

任何想法?

4

1 回答 1

0

What you want is an abstract factory implemented as an anonymous callback behind a facade. Confused? Hopefully won't be after this:

Define an interface for the anonymous callbacks:

private interface TaskFactory {
    Task create();
}

Refactor the base method to use a factory

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

Then create facade methods for each purpose:

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
于 2013-10-14T00:49:56.370 回答