gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:46 25 4
gpt4 key购买 nike

我在学习设计模式时遇到了一个我无法解决的问题。我正在编写客户端/服务器脚本。管理员客户端发送一个带有 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));

等等

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

关于Java 如果我有不同的构造函数但有相同的接口(interface),我应该使用什么设计模式来实例化对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48266633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com