工厂方法简介:
我们先来说一下简单工厂,简单工厂是一个工厂类创建多个实例对象,比如我们新增一个实例对象,工厂类就需要改变源代码,这违背了开闭原则。抽象工厂就是用来解决
这个问题的,我们用多个工厂创建不同的实例,怎么理解呢,就好比我要发送信息,发送kafka、企业微信的信息,我们就用两个工厂类来创建kafka和企业微信的对象,
这样就是不同的工厂类创建不同的实例对象,我要扩展的时候不会修改源代码了。
工厂方法模式的使用
工厂方法分为这几个角色:抽象产品、具体产品、抽象工厂、具体工厂,理清楚这几个角色,我会结合实例代码来讲解
抽象产品TaskInformationService:定义产品的接口,这个接口具体实例的公共父类
具体产品:也就是具体实现逻辑的子类,需要实现抽象产品的接口或者抽象类
抽象工厂:是所有子类工厂类的父类,抽象工厂可以是接口或者实现类
具体工厂:就是实例的工厂类,每个工厂创建不同的实例
业务场景:我这里有一个主体,要查询主体报告数量,主体类型不同,分为一级主体二级主体,依次到十多级主体,报告都需要查不同的数据库表,以及计算报告数量的方式不同
定义抽象产品
//查询主体数量
public void getEntityNum();
定义具体产品
@Service
public class FirstServiceImpl implements EntityService {
@Override
public void getEntityNum() {
System.out.println("查询一级主体数量");
}
}
@Service
public class SecondServiceImpl implements EntityService {
@Override
public void getEntityNum() {
System.out.println("查询二级主体数量");
}
}
抽象工厂
public interface EntityFactory {
//查询主体报告数量
public void getEntityReportNum();
}
具体工厂
/**
* 一等主体工厂
*/
@Service("firstEntityFactory")
public class FirstEntityFactory implements EntityFactory{
@Autowired
private FirstServiceImpl firstService;
@Override
public void getEntityReportNum() {
firstService.getEntityNum();
}
}
/**
* 二等主体工厂
*/
@Service("secondFactory")
public class SecondFactory implements EntityFactory{
@Autowired
private SecondServiceImpl secondService;
@Override
public void getEntityReportNum() {
secondService.getEntityNum();
}
}
controller测试
http://localhost:8080/entity?type=1
http://localhost:8080/entity?type=2
@RestController
public class EntityController {
@Autowired
private FirstEntityFactory firstEntityFactory;
@Autowired
private SecondFactory secondFactory;
@GetMapping("/entity")
public void entity(Integer type){
if (type == 1){
firstEntityFactory.getEntityReportNum();
}else if(type == 2){
secondFactory.getEntityReportNum();
}
}
}