我正在学习设计模式,我遇到了一个我无法解决的问题。我正在编写客户端/服务器脚本。管理员客户端以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);
}
}
}
答案 0 :(得分:5)
我只想使用抽象工厂模式:
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环境,您可以使用限定符使所有TaskFactory实例可注入。您可以绑定实际任务对象的延迟提供程序,也可以绑定类似工厂的对象(例如“辅助注入”)。