我有一个单例课程来管理我的所有服务。我用工厂模式替换了这个单例。所有服务都有一个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
}
所以我想我的问题是,这是处理用例的适当方法吗?我违反了我对这种模式的同意吗?
答案 0 :(得分:0)
您要实现的是一个简单工厂。
在工厂类中,我创建了一个方法,该方法允许通过参数传递现有对象。
这似乎并不像Factory,如果您传递此对象到此Factory类,则意味着它们是在其他地方创建的...因此该工厂并未实现其目的。
registerInstanceService(string,class,object)允许我注册具有不同构造函数参数的现有对象。
在您的代码中的任何地方都没有看到此方法签名。