我对Java很陌生并且在努力追随:
我有一个创建对象的类,其中保存了不同的数据(列表)。数据始终分配给一个非常标识符(属性):
class History {
private String identifier;
private ArrayList<ObjectsRelatedToIdentifier> objectsRelatedToIdentifier;
}
我现在需要每个标识符(X,Y,Z等)有一个对象,但只有一个。不应该用标识符X实例化两个对象。
此外,我需要能够从其他对象访问这些对象。我该如何“抓住”它们?
这些对象的内部总是相同的,只有标识符不同,当然还有ArrayList中的值。
是否存在某种“多重单一模式”或不同模式的组合?
答案 0 :(得分:1)
只需遵循单例模式,但不要只对公共对象进行一次引用,而是保留由标识符索引的引用映射。
public class MultiSingle {
public static MultiSingle getInstance(String id)
{
MultiSingle ret = id2obj.get(id);
if(ret == null)
{
ret = new MultiSingle();
id2obj.put(id,ret);
}
return ret;
}
private MultiSingle()
{
//Your stuff
}
private static Map<String, MultiSingle> id2obj = new HashMap<>();
}
答案 1 :(得分:1)
将您的历史记录对象放入HashMap
:
HashMap<String key,History h> map = new HashMap<String key,History h>();
map.put("X",new History());
答案 2 :(得分:1)
是否有某种&#34;多单身模式&#34;或不同模式的组合?
是的,multiton pattern。哪个(来自维基百科),
在软件工程中,多重模式是一种类似于单例的设计模式,它只允许创建一个类的一个实例。多元模式扩展了单例概念,以将命名实例的映射作为键值对进行管理。
答案 3 :(得分:0)
你想要的不是单身,它更像是Object Pool。
很像数据库连接池。每当您尝试连接到之前连接过的数据库时,您将从池中获得Connection
。如果您尝试连接到新数据库,将为您创建一个新的Connection
并添加到池中。
在内部,ConnectionPool
(或HistoryPool
)可以使用哈希映射实现,该哈希映射将连接字符串(或者,在您的情况下,标识符)映射到连接对象(实例) History
)。
答案 4 :(得分:0)
使用工厂创建对象并让它跟踪所有值。
首先使构造函数包本地化:
public class YourObject {
private String uniqueValue;
YourObject(String id) {
this.uniqueValue = id;
}
}
然后让其他人使用YourObjectFactory::create
实例化对象:
public final class YourObjectFactory {
private static Map<String, YourObject> instances = new HashMap<>();
public static synchronized YourObject create(String id) {
YourObject oldInstance = instances.get(id);
if (oldInstance == null) {
YourObject newInstance = new YourObject(id);
instances.put(id, newInstance);
return newInstance;
} else {
return oldInstance;
}
}
}
喜欢:
YourObject woah = YourObjectFactory.create("Woah!");
在此实现中,如果已为给定的id
创建了实例,则将返回对该实例的引用。如果您认为更合适,可以提出异常。