代码设计模式

文章目录

概要

工厂模式和模板模式

其实目前工厂模式和模板模式一直搞得不太清楚, 粗略写下demo示例

就是通过一个入口可以分流去不同方式实现

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());

相关推荐
李广坤13 小时前
状态模式(State Pattern)
设计模式
李广坤14 小时前
观察者模式(Observer Pattern)
设计模式
李广坤15 小时前
中介者模式(Mediator Pattern)
设计模式
李广坤15 小时前
迭代器模式(Iterator Pattern)
设计模式
李广坤16 小时前
解释器模式(Interpreter Pattern)
设计模式
阿无,19 小时前
java23种设计模式之前言
设计模式
Asort20 小时前
JavaScript设计模式(八):组合模式(Composite)——构建灵活可扩展的树形对象结构
前端·javascript·设计模式
数据智能老司机20 小时前
数据工程设计模式——数据基础
大数据·设计模式·架构
笨手笨脚の1 天前
设计模式-代理模式
设计模式·代理模式·aop·动态代理·结构型设计模式
Overboom1 天前
[C++] --- 常用设计模式
开发语言·c++·设计模式