2012-02-21 15 views
0

私はJavaでゲームを作っていますが、私は設計上の問題を抱えています。 私のリソース(イメージ、アニメーション、サウンド)は、リソースの種類ごとに1つずつ、いくつかのHashMapに格納されます。これらの(静的な)ハッシュマップは、 "Res"という静的クラスにあります。エンティティがリソースを必要とする場合、グローバルクラスのハッシュマップの1つにアクセスし、リソースが存在しない場合は自動的にロードされます。リソース管理の設計

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

シングルトンデザインパターン(静的インスタンスを使用)を使用できます。人々はそのシングルトンを誇張して好きです。ほとんどの場合 - はい、ただし特定の状況では、1つのキャッシュインスタンスを使用してください。 –

+0

静的メソッド/メンバーよりもシングルトンの利点は何ですか? – user10F64D4

+0

シングルトンは従来のクラスアプローチを保持しており、どこでもstaticキーワードを使用する必要はありません。最初は実装する必要がありますが、プログラムのアーキテクチャを大幅に簡略化します。 – 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

はそれをシンプルに保つ呼び出すことができます。あなたが "リソースキャッシュ"のいくつかの異なるインスタンスを必要としない限り、静的参照を使用することはOKです。

メソッド呼び出しの中であらゆる種類のオブジェクトへの参照が多すぎることを心配している場合は、「コンテキスト」オブジェクト内のすべてのオブジェクトへの参照を収集し、そのコンテキストを渡します。

関連する問題