工厂模式本质是让对获取对象过程的抽象

现有如下需求,根据输入类型,将数据存到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");
    }
}
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); } }

 

posted on 2023-03-04 21:31  colorfulworld  阅读(604)  评论(0编辑  收藏  举报