2016-12-23 13 views
0

私はすべてのクラスとクリエイターのデザインを決定しようとしています。Javaでクリエイタークラスとクラス自体の設計を実装する正しい方法は何ですか?

たとえば、私は2クラス、レベルLevelLoaderあります

を私はこれまで来ているデザインです。

これはレベルクラスである:

public class Level implements Serializable { 

    private byte[] map; 

    Level(LevelLoader loader){ 
     map = loader.getMap(); 
    } 

    // ... 
} 

これは創作者です:

だから私は何であるか興味津々

File file = new File("src/Level/level2.txt"); 
Level level1 = new Level(new TextLoader(file)); 

TextLoaderは、上記LevelLoaderインタフェースを実装している:私は書くつもりメインファイル内のレベルのインスタンスを作成するために、例えばので

public interface LevelLoader { public Level loadLevel(InputStream stream); public byte[] getMap(); } 

それらを他のものに接続する最も論理的な方法は?

答えて

0

以下のように感じます。

InputStream is = new File("src/Level/level2.txt"); 
LevelLoader levelLoader = new TextLoader(); 
Level level = levelLoader.loadLevel(file); 
+0

フィードバックに感謝します。私もそのように行くことを考えていましたが、どうしてなぜあなたはc'torの代わりにメソッドを使うのが好きですか? –

+0

これらのインターフェイスを他のクラスに実装すると、左側の変数がすべてインターフェイスのものであることがわかります。例えば、LevelLoader levelLoader = new SimpleLevelLoader(); ' –

+1

ファイルからいくつかの情報を収集する場合は、コンストラクタを必要としますが、ここでは両方を使用できます。他のオプションはコンストラクタからこのメソッドを呼び出すことができます。 –

1

確かに近い将来、より多くの実装が行われます。したがって、TextLoaderのようなインスタンスを直接作成することなく、Factoryを使用してインスタンスを取得します。

+0

興味深いことに、私は今作業中です。あなたはおそらく正しいでしょう:O –

1

申し訳ありません申し訳ありませんが、私は何について質問があるのですか?

は、おそらく: - あなたは、アプリケーションの実行時に、あなたのレベルのクラスの多くのインスタンスを作成する必要が - また、あなたが異なるローダーの種類の必要が​​あるかもしれない(ようにTextLoader、FileLoader、URLLoaderクラスとの...)次に

ます外部(つまり、UtiltiyまたはObjectFactoryクラス)の各ローダーを一度作成し、それらを再利用してインスタンスを作成することができます。そのような

何か:

のObjectFactoryクラス一般的に

private static LevelLoader filetLoaderInstance = new FileLoader("level2.txt"); 
private static LevelLoader urlLoaderInstance = new URLLoader("ftp://foo.com/level2.txt"); 

public static Level createLevelFromFile() 
{ 
    return new Level(textLoaderInstance); 
} 

public static Level createLevelFromURL() 
{ 
    return new Level(urlLoaderInstance); 
} 

複数の用法ような設計を必要とせずには必要ありません。 あなたの例のように

Level level1 = new Level(new TextLoader(file)); 

かなりオーバーヘッドです。一度しか実行されない場合、別のオブジェクト(TextLoader)を作成して作成する理由は何ですか?

しかし、そのコードを何度も実行する必要がある場合は、それは良くありません。 Loaderクラスのインスタンスが作成されるたびに作成するのではなく、TextLoaderのインスタンスを1つだけ作成する方がよいでしょう。 アプリケーションのパフォーマンスだけでなくメモリ使用量にも影響します。

+0

そのコードは、ユーザーが前進したり新しいレベルを読み込んだりするたびに何度も実行しなければなりません。だから私は今あなたの答えから、私は工場パターンの代わりに行くべきだと理解しています。 –

+1

私はそれが両方のパターンのかなりかもしれないと思う。このパターンの別の利点があります。 Levelクラスの開発者がLevelLoaderの実装の可能性を事前に知らず、実際に気にしないときにAPIフレームワークを作成することは良いことです。彼はDefaultLoaderを作成することができますが、より多くの種類を作る機会を残しています。 – Vadim

関連する問題