如何让java singleton对象管理器返回任何类型的对象?

时间:2010-05-16 18:42:12

标签: java design-patterns class singleton

我正在从头开始用java编写一个互动小说游戏。我目前正将所有游戏对象引用存储在一个名为ObjectManager的单例中的hashmap中。 ObjectManager有一个名为get的函数,它接受一个整数ID并返回适当的引用。问题是当我需要返回具有更多功能的BaseObject的子类时,它返回一个BaseObject。

所以,到目前为止,我已经添加了一个getEntity函数,它返回BaseEntity(它是BaseObject的子类)。但是,当我需要函数返回一个对象时,该对象是已添加所需功能的BaseEntity的子类,我将需要创建另一个函数。我知道有更好的方法,但我不知道它是什么。我对设计模式知之甚少,而且我不确定在这里使用哪一个。我尝试将'class'作为参数传递,但这并没有把我带到任何地方。

public BaseObject get(int ID){
    return (BaseObject)refMap.get(ID);
}

public BaseEntity getEntity(int ID){
    return (BaseEntity)refMap.get(ID);
}

谢谢,java忍者!

3 个答案:

答案 0 :(得分:2)

我不鼓励你继续这个设计。

Google eradicating singletons from their Java code base;也许这对你来说也是一个好主意。

听起来你正在尝试做一些Spring的ApplicationContext做得很好的事情。您正在尝试编写可配置,灵活的对象工厂。它已经完成了。我会研究像Spring和Guice这样的依赖注入引擎。即使你决定不使用它们,也许它们可以提供一些设计灵感。

您可以做的最好的事情是返回一个Object并进行强制转换。

答案 1 :(得分:2)

如果您有Java 5运行时,请使用泛型返回类型:

public <Entity extends BaseEntity> Entity getEntity(int ID){
    return (Entity)refMap.get(ID);
}

答案 2 :(得分:0)

这两种方法做同样的事情;第二个只是保持呼叫者进行演员表演。如果你不想为每个子类创建一个函数,那么一个答案就是:不要。调用者必须进行投射,但它的功能与您现在正在执行的功能一样好。

你可以在泛型中使用相同的方法:

<U> U get(int id, Class<U> clazz) {
  return (U) refMap.get(id);
}

但它并没有多大地保存调用者,因为它只传递Class个对象而不是传递。

如果你不想让调用者做这项工作,你需要编写那些专门的方法。