java - java中输出类型不同时的工厂模式

标签 java design-patterns factory

我是 java 的新手,下面是我的映射器接口(interface)定义:

public interface CourseMapper {
    Course map(JsonObject courseJson);
    List<Course> map(JsonArray coursesJson);
}

public interface LocationMapper {
    Location map(JsonObject locationJson);
    List<Location> map(JsonArray locationsJson);
}

下面是两个类:

public interface Location {
    Long id();
    String name();
    Location mutate(Long id);
}

public interface Course {
    Long id();
    String name();
    Course mutate(Long id);
}

我需要的是基于一个key(String),我需要调用相应Mapper的相应map()函数。例如,如果 key=="location",我需要调用 LocationMapper,如果 key=="course",我需要调用CourseMapper(针对gson Mapper)......等等。

我尝试使用 Factory Pattern 进行相同的操作,但当输出类型不同时,它似乎不起作用。有谁知道如何在不明显复杂化 if-else 阶梯的情况下实现同样的目标。

最佳答案

最简单的方法是使用 Map<String, Object>将您的映射器存储在:

private Map<String, Object> mappers;

public <T> T getMapper(String key, Class<T> mapperType) {
    Object mapper = mappers.get(key);
    // code for when mapper == null
    if (mapperType.isAssignableFrom(mapper)) {
        return (T) mapper;
    } else {
         // code for when mapper is of wrong type
    }
}

但是您会注意到,这放弃了静态类型检查,因此任何类型不匹配只能在运行时发现。


一种更复杂的方法可以省去(某种程度上)静态类型检查。它基本上将结果类型与字符串键联系起来:

private static class MapperKey<T> {
    private final String key;

    public MapperKey(String key) {
        this.key = key;
    }
}

private Map<String, Object> mappers;

public static final MapperKey<CourseMapper> COURSE_KEY = new MapperKey<CourseMapper>("course");

public <T> void addMapper(MapperKey<T> mapperKey, T mapper) {
    mappers.put(mapperKey.key, mapper);
}

public <T> T getMapper(MapperKey<T> mapperKey) {
    Object mapper = mappers.get(mapperKey.key);
    // code for when mapper == null
    return (T) mapper;
}

然而,这种方法取决于用户使用 MapperKey 的预定义常量s,或创建正确的 key (相应 key 的正确类型参数)。


最后,如果你能更换你的 CourseMapperLocationMapper与此接口(interface):

public interface Mapper<T> {
    T map(JsonObject courseJson);
    List<T> map(JsonArray coursesJson);
}

如果每种输出类型只需要一个映射器,则可以使用输出类型作为键:

private Map<Class<?>, Mapper<?>> mappers;

public <T> void addMapper(Class<T> outputType, Mapper<T> mapper) {
    mappers.put(outputType, mapper);
}

@SuppressWarnings("unchecked")
public <T> T getMapper(Class<T> outputType) {
    return (T) mappers.get(outputType);
}

关于java - java中输出类型不同时的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42220554/

相关文章:

java - 如何使用 Java 将 .wav 转换为 .mp3?

c++ - 抽象工厂模式中将工厂方法插入哪里?

javascript - TypeError: Factory.function 不是函数

PHP 扩展类使子级继承相同的静态属性

c++ - 自定义对象工厂

java - Junit 想在一定时间后停止该方法

java - 获取直到午夜的毫秒数

java - 检查 GPS 和蓝牙是否已激活时出现问题

angularjs - 如何在整个应用程序中以 Angular 2 保存来自多个服务的数据?

C++ 设计模式 : multiple ways to load file