Java 如果我有不同的构造函数但相同的接口,我应该使用什么设计模式进行对象实例化



我正在学习设计模式,遇到了一个我无法解决的问题。我正在编写客户端/服务器脚本。管理员客户端以 json 格式发送任务及其任务数据,服务器应根据接收的任务类型实例化对象,并用正确的类填充其构造函数。正如您在下面看到的,有两个示例类。

public class StartProcessing implements ITask{
    private final IProcessor dataProcessor;
    public StartProcessing(IProcessor dataProcessor){
        this.dataProcessor = dataProcessor;
    }
    @Override
    public void ProcessTask() {
        this.dataProcessor.StartProcess();
    }
}
public class StartQueueFiller implements ITask{
    private IQueueFiller queueFiller;
    public StartQueueFiller(IQueueFiller queueFiller){
        this.queueFiller = queueFiller;
    }
    @Override
    public void ProcessTask() {
        this.queueFiller.Start();
    }
}
interface ITask {
    public void ProcessTask();
}

我已经尝试过这样的事情,但是我将有大约 50 个不同的过程和数百个任务,因此构造函数将难以管理,我认为在这种情况下工厂模式不是那么好,可能我只是错过了模式的重点。那么您将如何解决这个问题呢?我应该使用什么来代替工厂模式?

public class TaskFactory(){
    private final IProcessor processor;
    private final IQueueFiller queuefiller;
    public TaskFactory(IProcessor processor, IQueueFiller queuefiller){
        this.processor = processor;
        this.queuefiller = queuefiller;
    }
    public ITask Create(String task){
        switch(task){
            case "startprocessor":
                return new StartProcessing(this.processor);
            case "startqueuefiller":
                return new StartQueueFiller(this.queuefiller);
        }
    }
}

我只会使用抽象工厂模式:

public interface TaskFactory {
    Task create();
}

然后我们可以将一堆工厂存储在某种数据结构中,例如:

private final Map<String, TaskFactory> factoriesMap = new HashMap<>();
void registerFactory(String identifier, TaskFactory factory) {
    factoriesMap.put(identifier, factory);
}
public Task create(String identifier) {
    return factoriesMap.get(identifier).create();
}

然后我们可以使用 lambda 或其他东西注册不同类型的工厂:

Processor processor = ...;
registerFactory("startprocessor", () -> new StartProcessingTask(processor));

等。

在某些时候,您会意识到您的"工厂地图"基本上是一种服务定位器,在这种情况下,您要么需要加倍努力,要么找到替代解决方案。我倾向于将依赖注入作为一种方法。根据您的 DI 环境,您可以使用限定符使所有任务工厂实例都可注入。您可以绑定实际任务对象的惰性提供程序,也可以绑定类似工厂的对象(例如"辅助注入"(。

最新更新