Вы можете использовать статический HashMap (или Hashtable для безопасности потоков), чтобы хранить все экземпляры для разных шаблонов, как упоминалось в @ reed-copsey.
Пример класса Singleton:
public class Singleton<T extends Parent> {
private static HashMap<Class, Singleton> instanceMap = new HashMap<Class, Singleton>();
private Singleton() {
}
public static <T> Singleton getInstance(Class<T> tClass) {
if (!instanceMap.containsKey(tClass))
instanceMap.put(tClass, new Singleton());
return instanceMap.get(tClass);
}
}
Вы можете использовать этот синглтон как:
public static void main(String[] args) {
Singleton instance1 = Singleton.getInstance(Child1.class);
Singleton instance2 = Singleton.getInstance(Child1.class);
assert instance1 == instance2;
Singleton instance3 = Singleton.getInstance(Child2.class);
assert instance1 != instance3;
}
Класс Singleton будет возвращать разные экземпляры для разных типов классов.