实践Spring Boot中的工厂模式项目实战

43 阅读1分钟

实践Spring Boot中的工厂模式项目实战

Spring Boot中工厂模式的示例

下面展示一个在Spring Boot中应用工厂模式的例子,这里我们将创建一个简单的LanguageProcessor接口以及几个具体的语言服务实现,并通过一个工厂类来根据外部输入动态创建相应的选择语言。

定义处理器接口定义处理器接口

public interface LanguageProcessor {
    void process(String languageType);
}

实现处理器接口的类


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
@Component
public class EnglishProcessor implements LanguageProcessor{
    protected Logger logger = LoggerFactory.getLogger(getClass());
 
    @Override
    public void process(String languageType) {
        logger.info("The current selection is English!");
    }
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
@Component
public class ChineseProcessor implements LanguageProcessor{
    protected Logger logger = LoggerFactory.getLogger(getClass());
 
    @Override
    public void process(String languageType) {
        logger.info("当前选择的是中文!");
    }
}

创建工厂类

import com.example.demo.processor.LanguageProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
 

@Component
public class LanguageProcessorFactory {
 
    private final Map<String, LanguageProcessor> processorMap = new ConcurrentHashMap<>();
 
    @Autowired
    public LanguageProcessorFactory(Map<String, LanguageProcessor> beansOfType) {
        // 将所有实现了Processor接口的Bean注入到map中
        this.processorMap.putAll(beansOfType);
    }
 
    public LanguageProcessor getLanguageProcessor(String type) {
        return processorMap.get(type);
    }
}

控制层


import com.example.demo.factory.LanguageProcessorFactory;
import com.example.demo.utils.result.ResultEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @author YangDi
 * @since 2024/3/20
 */
@RestController
@RequestMapping("/language")
public class LanguageController {
 
    @Autowired
    private LanguageProcessorFactory languageProcessorFactory;
 
    @RequestMapping("/selectLanguage")
    public ResultEntity<String> selectLanguage(@RequestParam String languageType) {
        languageProcessorFactory.getLanguageProcessor(languageType).process(languageType);
        return ResultEntity.success("success");
    }
}