将物体传递到工厂

时间:2019-07-23 19:25:45

标签: java spring factory-pattern

我有一个单例课程来管理我的所有服务。我用工厂模式替换了这个单例。所有服务都有一个initialize()和一个close()。我的大多数服务都接受构造函数参数,并且因服务而异-这就是设计开始崩溃的地方。

我正在使用Spring Boot初始化我的singletonCache。 Spring无法管理某些服务,因为它们需要在运行时创建。

在工厂类中,我创建了一个方法,该方法允许通过参数传递现有对象。我将这些实例存储在instanceCache中,并在以后检索它们。 registerInstanceService(string, class, object)允许我使用不同的构造函数参数注册现有对象。我不确定这是否会被视为反模式。

这是工厂的摘要:

@Service
public class ServiceFactory {

    @Autowired
    private List<PlatformService> services;

    private static final Map<Class<? extends PlatformService>, PlatformService> singletonCache = new HashMap<>();

    private static final Map<String, PlatformService> instanceCache = new HashMap<>();

    @PostConstruct
    public void initializeSingletonCache() {
        services.forEach(service -> {
            singletonCache.put(service.getClass(), service);
            service.initialize();
        });
    }

    public static <T extends PlatformService> T registerInstanceService(String serviceName, Class<T> service) throws RuntimeException, InstantiationException, IllegalAccessException {
        if (instanceCache.containsKey(serviceName)) {
            throw new RuntimeException("An instance with the name " + serviceName + " has already been created");
        }

        T serviceObject = service.newInstance();
        instanceCache.put(serviceName, serviceObject);
        serviceObject.initialize();
        return serviceObject;

    }

    public static <T extends PlatformService> void registerInstanceService(String serviceName, T service) throws Exception {
        if (instanceCache.containsKey(serviceName)) {
            throw new RuntimeException("An instance with the name " + serviceName + " has already been created");
        }

        service.initialize();
        instanceCache.put(serviceName, service);
    }

    public static <T extends PlatformService> T getService(Class<T> service) {
        return service.cast(singletonCache.get(service));
    }

    //...
    //getters

}

所以我想我的问题是,这是处理用例的适当方法吗?我违反了我对这种模式的同意吗?

1 个答案:

答案 0 :(得分:0)

您要实现的是一个简单工厂。

  

在工厂类中,我创建了一个方法,该方法允许通过参数传递现有对象。

这似乎并不像Factory,如果您传递此对象到此Factory类,则意味着它们是在其他地方创建的...因此该工厂并未实现其目的。

  

registerInstanceService(string,class,object)允许我注册具有不同构造函数参数的现有对象。

在您的代码中的任何地方都没有看到此方法签名。