【发布时间】:2017-12-04 21:18:40
【问题描述】:
背景
我有一种情况,我正在开发一个像线程一样运行的程序。基本上,有一个“主”程序同时运行子程序的实例。
由于该系统的性质,“子程序”都在单个Java Virtual Machine 下运行。这里最严重的含义是它们共享内存空间。
在我的子程序中,我想创建一个 Logger 类,以便我的子程序中的所有类都可以登录到一个位置。由于这个项目可以包含许多类,我想避免依赖注入并使用单例。
但是如果我使用单例,实例将被静态存储。因此,如果 JVM 运行了我的程序的 2 个实例,则 Logger 类将为它们提供相同的实例(因为它们共享该内存)。
我希望每个子程序都有自己的记录器,而不需要依赖注入。
存在一个唯一标识符,我可以调用每个程序来区分它们。
我目前的解决方案
假设“uniqueID”是主程序接收然后返回子程序调用它的 API 调用。假设此调用产生极少的计算开销。
public class Logger {
private static HashMap<string,Logger> instances = new Hashmap<>();
public static Logger instance() {
if(instances.containsKey(uniqueId)) {
return instances.get(uniqueId);
} else {
Logger newLogger = new Logger();
instances.put(uniqueId, newLogger);
return newLogger;
}
}
private Logger(){}
}
此解决方案允许每个子程序将 Logger 类视为 Singleton,但它并不完全是 Singleton。它充当实例管理器,根据与方法交互的子程序创建和返回实例。
我的问题
这个解决方案在技术上不是一个单例,但每个使用它的项目都把它当作一个单例。 它是什么设计模式?
另外,这是解决我的问题的正确方法吗?我该如何改进它?
【问题讨论】:
标签: java multithreading static singleton