工厂模式本质是让对获取对象过程的抽象
现有如下需求,根据输入类型,将数据存到Mongo还是Oracle,如下两个实例分别不使用工厂与使用工厂模式的比较
1. 不使用工厂模式
如下实例中,根据controller层输入type不同类型,需要hardcode加if...else..逻辑来判断执行哪个service。而且在controller层需要注入这两个service,以后如果还要存sqlserver需要改controller显得代码耦合性很高
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Contorller: @RestController @RequestMapping public class Controller { @Autowired @Qualifier("step1") private IStoreData iStoreData1; @Autowired @Qualifier("step2") private IStoreData iStoreData2; @RequestMapping("login") public void test(String type){ if(StringUtils.equalsIgnoreCase(type,"step1")){ iStoreData1.doStep(); } else if(StringUtils.equalsIgnoreCase(type,"step2")){ iStoreData2.doStep(); } } } Interface: public interface IStoreData { public void doStep(); } Service1: @Service public class StoreDataInMongo implements IStoreData { public void doStep(){ System.out.println("store data in Mongo"); } } Service2: @Service public class StoreDataInOracle implements IStoreData { public void doStep(){ System.out.println("store data in Oracle"); } }View Code
2. 使用工厂模式 -- iStepMap来获取相应service
如下例中,采用工厂模式,以后如果新增其他类型service可以不用改controller、工厂类以及Interface。只需要新增一个service即可。降低代码见耦合度。
另外使用工厂模式将被调用实例(storeService)创建交给工厂类来完成
controller: @RestController @RequestMapping public class FController { @Autowired private FactoryService fService; //controller层只需要注入工厂类,如果后续需往sqlserver存数据,只需要新增一个sqlserver存数据的service即可,工厂类、controller不需要该任何内容。实现代码解耦 @RequestMapping("factory") public void test(String type){ IFStoreData step= fService.getStep(type); step.doStep(); } } Interface: public interface IFStoreData { public void doStep(); } Service1: @Service public class FStoreDataInMongo implements IFStoreData { public void doStep(){ System.out.println("store data in Mongo"); } } Service2: @Service public class FStoreDataInOracle implements IFStoreData { public void doStep(){ System.out.println("store data in Oracle"); } } FactoryService(工厂类): public class FactoryService{
/*
FStoreInMongo,FStoreInOracle都有@Service注解,Springboot启动会被自动扫描;
同时定义一个Map,将bean注入到map中,key为bean名字(注意key会将类名自动变为小写,如果想指定名称,可以使用@Service("XXX")),value为对象实例
*/
@Autowired private Map<String, IFStoreData> iStepMap=new ConcurrentHashMap<>(); public IFStoreData getStep(String key){ return iStepMap.get(key); } }
标签:SpringBoot,void,模式,工厂,class,controller,doStep,public From: https://www.cnblogs.com/enhance/p/17179163.html