2012-02-21 3 views
0

Я делаю игру в java, и я застреваю с проблемой дизайна. Мои ресурсы (изображения, анимации, звуки) хранятся в нескольких HashMaps, по одному для каждого типа ресурсов. Эти (статические) hashmaps находятся в статическом классе под названием Res. Когда объект нуждается в ресурсе, он обращается к одному из хэш-карт глобального класса, и если ресурс не существует, он автоматически загружается.Дизайн управления ресурсами

static Map<String, Sprite> sprites = new HashMap<>(); 
static Map<String, BufferedImage> images = new HashMap<>(); 
static Map<String, Clip> sounds = new HashMap<>(); 
static Map<String, Font> fonts = new HashMap<>(); 

Мой вопрос: эта конструкция достаточно хороша? Я читал, что статические функции - это плохая практика, но нужно ли мне каждый раз передавать экземпляр класса «Res»? Или есть другие альтернативы? А также, является ли эта система управления ресурсами хорошей практикой? Спасибо заранее!

+0

Вы можете использовать шаблон одноэлементного дизайна (статический экземпляр под капотом). Люди любят преувеличивать, что синглтоны плохи. В большинстве случаев - да, но в вашем конкретном, используя один экземпляр кеша в желаемой ситуации. –

+0

В чем преимущество синглтона над статическими методами/членами? – user10F64D4

+0

Singletons сохраняют традиционный подход класса и не требуют, чтобы вы использовали статическое ключевое слово везде. Вначале они могут быть более требовательными, но значительно упростят архитектуру вашей программы. – Rudy

ответ

0

Используйте Singleton для сохранения всех ресурсов вместо этих статических функций.

public class ResourceSingleton { 
    private Map<String, Sprite> sprites = new HashMap<>(); 
    private Map<String, BufferedImage> images = new HashMap<>(); 
    private <String, Clip> sounds = new HashMap<>(); 
    private <String, Font> fonts = new HashMap<>();  

    public Map getSprites() 
    {return sprites;} 

    public void setSprites(Map<String,Sprite> sprites) 
    { this.sprites = sprites; } 

    //generate other getter setter 

    // Private constructor prevents instantiation from other classes 
    private ResourceSingleton() { } 


    private static class SingletonHolder { 
      public static final Singleton instance = new Singleton(); 
      //populate your resource here. 
    } 

    public static ResourceSingleton getInstance() { 
      return SingletonHolder.instance; 
    } 

}

Для использования ресурса вы можете просто позвонить

ResourceSingleton res = ResourceSingleton.getInstance(); 
Sprite firstSprite = res.getSprites().get("firstSprite"); 
+0

Рекомендуется использовать перечисление при реализации одноэлементного шаблона. – assylias

+0

прочитал ответ Джона Скита: http://stackoverflow.com/questions/427902/what-is-the-best-approach-for-using-an-enum-as-a-singleton-in-java – Rudy

+0

Спасибо! Это немного дольше, но я буду использовать его. – user10F64D4

0

Держите его просто. Пока вам не нужны несколько разных экземпляров вашего «кэша ресурсов», использование статической ссылки в порядке.

Если вы беспокоитесь о необходимости передавать слишком много ссылок на все виды объектов в ваших вызовах методов, вы можете собирать ссылки на все ваши объекты в объекте «context» и передавать только один из них.

Смежные вопросы