工厂模式和模板模式
其实目前工厂模式和模板模式一直搞得不太清楚, 粗略写下demo示例
就是通过一个入口可以分流去不同方式实现
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// 获取某一接口的所有实现类,并通过枚举完成策略模式
Map<String, TaskService> map = applicationContext.getBeansOfType(TaskService.class);
taskServiceMap = new HashMap<>();
map.forEach((key, value) -> {
for (ContentType contentType : value.getType()) {
taskServiceMap.put(contentType, value);
}
});
}
/**
* 获取检测服务
*
* @param type type
* @return task service
*/
public TaskService getTaskService(ContentType type) {
return taskServiceMap.get(type);
}
以上基于的是spring提供的applicationContext.getBeansOfType方法, 他会把全部的重写了某个接口全部的类返回回来
下面另外一种示例, 通过枚举获得类对象
通过Class<? extends IExtractAnimal> extractorClazz; 这种方法保存类对象, 需要的时候通过newInstacnce 创建对象出来
public enum AnimalInfoType {
DOG(“.dog”, “this is a dog”, Dog.class),
CAT(“.pptx”, “this is a cat”, Cat.class),
PIG(“.docx”, “this is a pig”, Pig.class),
/**
* 重量
*/
private String weight;
/**
* 颜色
*/
private String color;
/**
* 动物抽取器
*/
private Class<? extends IExtractAnimal> extractorClazz;
FileInfoType(String weight, String color, Class<? extends IExtractAnimal> extractorClazz) {
this.weight = weight;
this.color = color;
this.extractorClazz = extractorClazz;
}
public Class<? extends IExtractAnimal> getExtractorClazz() {
return extractorClazz;
}
/**
* 获取动物类型
*
* @param filePath fileSuffix
* @return DocumentType
*/
public static Optional<AnimalInfoType> getFileInfoBySuffix(String weight) {
for (FileInfoType type : AnimalInfoType.values()) {
if (weight.endsWith(String.valueOf(type.weight))) {
return Optional.of(type);
}
}
return Optional.empty();
}
}
public class AnimalFactory {
static List<String> supportTypeList = Arrays.asList("dog", "cat", "pig");
public static IExtractFileInfo getInstance(AnimalType animalType) {
if (animalType == null) {
return null;
}
return infoType.getExtractorClazz().newInstance();
}
}
Optional animalInfoType = AnimalInfoType.getFileInfoBySuffix(currentResult.getRealPath());
if (!animalInfoType.isPresent()) {
return;
}
// 根据工厂类获得对应的动物类
IExtractAnimal extractAnimal = AnimalFactory.getInstance(animalInfoType.get());