什么是抽象工厂
先说一下简单工厂,简单工厂是一个工厂类创建多个实例,工厂方法是一个抽象工厂有多个实例工厂,每个实例工厂创建一个类的实例,而抽象工厂是一个抽象工厂有多个子类实例工厂,每个实例工厂创建一组实例,什么叫一组实例,这个和简单工厂有区别,简单工厂是针对同一类型的,比如说发消息,短信发送,boss发送一类的,而抽象工厂是要生成一组,比如是家具制造商,要生成出沙发、饭桌、板凳、椅子,抽象工厂就是生成出这一组家具出来。抽象工厂有两个概念产品等级结构与产品族,产品等级是什么,抽象一个电视机,它的子类就是海尔电视剧、格力电视剧,这就是产品等级,都是电视剧只不过品牌不同,产品族是什么,比如一个生产电器的工厂,不能让他只生产电器,还可以生产电冰箱、电脑、电空调,很多个种类,这就是产品族。
产品等级结构与产品族示意图如图3所示:
在图3中,不同颜色的多个正方形、圆形和椭圆形分别构成了三个不同的产品等级结构,而相同颜色的正方形、圆形和椭圆形构成了一个产品族。
我有一个需求,需要查询基础层、中间层、指标层的数据,需要查询两个,一个是名称,一个是数据,三个层级的名称和数据就是产品等级,每个层级都要查询名称和数据就是产品族
四个角色
抽象产品:一般定义接口或者抽象类,提供给具体产品
具体产品:抽象产品的子类,写具体代码逻辑
抽象工厂:一般定义接口或者抽象类,提供给具体工厂
具体工厂:抽象工厂的子类,调用具体产品的方法
抽象产品
public interface EvdDataOptionService {
//查询数据选项
public List<String> getDataOptionList();
}
public interface EvdDataService {
//查询层级名称
public String getHierarchyName();
}
具体产品
/**
* 查询基础层名称
*/
@Service
public class EvdBaseLayerServiceImpl implements EvdDataService {
@Override
public String getHierarchyName() {
return "基础层名称";
}
}
/**
* 查询指标层名称
*/
@Service
public class IndexLevelServiceImpl implements EvdDataService {
@Override
public String getHierarchyName() {
return "指标层名称";
}
}
/**
* 查询中间层名称
*/
@Service
public class InterlayerServiceImpl implements EvdDataService {
@Override
public String getHierarchyName() {
return "中间层名称";
}
}
/**
* 指标层数据选项
*/
@Service
public class LayerDataOptionsServiceImpl implements EvdDataOptionService {
@Override
public List<String> getDataOptionList() {
return Arrays.asList("指标层数据选项");
}
}
/**
* 中间层数据选项
*/
@Service
public class MidtierDataOptionsServiceImpl implements EvdDataOptionService {
@Override
public List<String> getDataOptionList() {
return Arrays.asList("中间层数据选项");
}
}
/**
* 基础数据选项
*/
@Service
public class UnderlyingDataOptionServiceImpl implements EvdDataOptionService {
@Override
public List<String> getDataOptionList() {
return Arrays.asList("基础数据选项");
}
}
抽象工厂
/**
* 抽象工厂
*/
public interface EvdFactory {
//查询层级名称
public String getFactotyHierarchyName();
//查询数据选项
public List<String> getFactotyDataOptionList();
}
具体工厂
/**
* 基础层工厂
*/
@Service
public class BaseLayerFactory implements EvdFactory{
@Autowired
private EvdBaseLayerServiceImpl evdBaseLayerService;
@Autowired
private UnderlyingDataOptionServiceImpl underlyingDataOptionService;
@Override
public String getFactotyHierarchyName() {
return evdBaseLayerService.getHierarchyName();
}
@Override
public List<String> getFactotyDataOptionList() {
return underlyingDataOptionService.getDataOptionList();
}
}
/**
* 指标层工厂
*/
@Service
public class IndexLevelFactory implements EvdFactory{
@Autowired
private IndexLevelServiceImpl indexLevelService;
@Autowired
private LayerDataOptionsServiceImpl layerDataOptionsService;
@Override
public String getFactotyHierarchyName() {
return indexLevelService.getHierarchyName();
}
@Override
public List<String> getFactotyDataOptionList() {
return layerDataOptionsService.getDataOptionList();
}
}
/**
* 中间层工厂
*/
@Service
public class InterlayerFactory implements EvdFactory{
@Autowired
private MidtierDataOptionsServiceImpl midtierDataOptionsService;
@Autowired
private InterlayerServiceImpl interlayerService;
@Override
public String getFactotyHierarchyName() {
return interlayerService.getHierarchyName();
}
@Override
public List<String> getFactotyDataOptionList() {
return midtierDataOptionsService.getDataOptionList();
}
}
controller调用
http://localhost:8080/evdData?type=1
http://localhost:8080/evdData?type=2
http://localhost:8080/evdData?type=3
@RestController
public class EvdDataController {
@Autowired
private BaseLayerFactory baseLayerFactory;
@Autowired
private InterlayerFactory interlayerFactory;
@Autowired
private IndexLevelFactory indexLevelFactory;
@GetMapping("/evdData")
public void evdData(Integer type){
if(type == 1){
System.out.println(baseLayerFactory.getFactotyHierarchyName());
System.out.println(baseLayerFactory.getFactotyDataOptionList());
}else if(type == 2){
System.out.println(interlayerFactory.getFactotyDataOptionList());
System.out.println(interlayerFactory.getFactotyHierarchyName());
}else if(type == 3){
System.out.println(indexLevelFactory.getFactotyDataOptionList());
System.out.println(indexLevelFactory.getFactotyHierarchyName());
}
}
}