Spring 和工厂方法

问题描述 投票:0回答:1

我想在工厂方法中实例化一个类,并执行接口中定义的方法的相应实现。 我的问题是我不想自己创建这样一个类的依赖项(它们是嵌套的),而是让 Spring 将它们注入到这个类中。

我的代码是:

public Interface BasicProcess {
     Message createProcess()
}


@RequiredArgsConstructor
public Class WorkProcess implements BasicProcess {
 
   private final HelperService;
   
   @Override
   Message createProcess(){
      //do some logik
   }
}

@RequiredArgsConstructor
public Class EatProcess implements BasicProcess {

   private FoodService;

   @Override
   Message createProcess(){
      //do some other logik
   }
}

现在我决定,我要实例化哪个“Bean”:

@Service
@RequiredArgsConstructor
public class Factory(){

     
     private final HelperService helperService;

     
     private final FoodService foodService;

     public BasicProcess factoryMethod(String param){

         if(param=="Work"){
             return new WorkProcess(helperService)
         } else if (param == "Food") {

              return new EatProcess(foodService)
         }
     
     }
    }

现在我正在调用特定的实现:

@RequiredArgsConstructor
@Component
class SomeClass{

   private final Factory factory;

   public void startProcess(){
        BasicProcess processfactory.factoryMethod("Food");
        processfactory.createProcess(); //calling EatProcess implementation
   }

}

是否有一些更好的解决方案来动态调用“createProcess”? 我不喜欢说“new WorkProcess(....)”

java spring-boot polymorphism
1个回答
0
投票

您可以将必要的依赖项注入到

SomeClass
的构造函数中,然后使用这些依赖项来创建
BasicProcess
实现的实例。

工作代码:

public interface BasicProcess {
    Message createProcess();
}

@RequiredArgsConstructor
public class WorkProcess implements BasicProcess {

    private final HelperService helperService;

    @Override
    public Message createProcess() {
        // other codes
        return new Message("WorkProcess executed");
    }
}

@RequiredArgsConstructor
public class EatProcess implements BasicProcess {

    private final FoodService foodService;

    @Override
    public Message createProcess() {
        // other logic
        return new Message("EatProcess executed");
    }
}

@Service
@RequiredArgsConstructor
public class Factory {

    private final HelperService helperService;
    private final FoodService foodService;

    public BasicProcess factoryMethod(String param) {
        if ("Work".equals(param)) {
            return new WorkProcess(helperService);
        } else if ("Food".equals(param)) {
            return new EatProcess(foodService);
        }
        return null; 
    }
}

@Component
@RequiredArgsConstructor
public class SomeClass {

    private final Factory factory;

    public void startProcess() {
        BasicProcess process = factory.factoryMethod("Food");
        if (process != null) {
            process.createProcess(); // calling EatProcess implementation
        } else {
            // Handle invalid param 
        }
    }
}

在这里,您的依赖项

HelperService
FoodService
被注入到
WorkProcess
EatProcess
的构造函数中。 Factory 类中的工厂方法负责根据参数创建 BasicProcess 实现的实例。然后,SomeClass 组件使用工厂获取实例并调用 createProcess 方法。

© www.soinside.com 2019 - 2024. All rights reserved.