gpt4 book ai didi

java - 将对象传递到工厂

转载 作者:行者123 更新时间:2023-12-02 02:42:14 25 4
gpt4 key购买 nike

我有一个单例类来管理我的所有服务。我正在用工厂模式替换这个单例。所有服务都有一个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

}

所以我想我的问题是,这是处理我的用例的合适方法吗?我是否违反了与该模式的协议(protocol)?

最佳答案

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

In my factory class, I created a method that allows passing of existing objects via an argument.

这看起来并不像工厂,如果你传递这个对象到这个工厂类,这意味着它们是在其他地方创建的......所以这个工厂没有完成它的目的。

The registerInstanceService(string, class, object) allows me to register existing objects with varying constructor arguments.

我在您的代码中没有看到此方法签名。

关于java - 将对象传递到工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57170935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com