工厂模式本质是让对获取对象过程的抽象
现有如下需求,根据输入类型,将数据存到Mongo还是Oracle,如下两个实例分别不使用工厂与使用工厂模式的比较
1. 不使用工厂模式
如下实例中,根据controller层输入type不同类型,需要hardcode加if...else..逻辑来判断执行哪个service。而且在controller层需要注入这两个service,以后如果还要存sqlserver需要改controller显得代码耦合性很高

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"); } }
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); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?