public class ObjectCache extends HashMap { private final Factory factory; public interface Factory { T getObject(String key); } public ObjectCache(Factory factory) { this.factory = factory; } @Override public T get(Object key) { if (!(key instanceof String)) throw new IllegalArgumentException("Key must be a string"); String search = (String)key; if (search.isEmpty()) return null; T obj = super.get(key); if (null == obj) { obj = factory.getObject(search); if (null != obj) put(search, obj); } return obj; } }