2012-03-20 11 views
1

に私は、コードスタイルについて質問があります。これに基づいて、私は工場でオブジェクトを作成したい。これを行うには良い(ときれい)な方法があるかどう効果とかなり文字列の条件は、Java

if(string.equals("Information1")){ 
    Factory.createInformation1Object(); 
} 
if(string.equals("Information2")){ 
    Factory.createInformation2Object(); 
} 
if(string.equals("Information3")){ 
    Factory.createInformation3Object(); 
} 

は、今私が思っていた。もちろん、私はこのような何かを書くことができます。ビジターパターンの複数のディスパッチアイデアが本当に好きですが、この特定の問題に簡単にこれを適用する方法はありません。

+0

「情報[0-9]」のような正規表現をマッチャーで使用できますか?しかし、私はより良い方法ではありません。 – Kiwy

答えて

7

abstract factory patternを使用できます。

それを拡張する抽象クラスFactory [またはインタフェース]、およびクラスを作成します。MyObject1FactoryMyObject2Factory、...

前処理では、coresponding FactoryインスタンスにStringからMap<String,Factory>を投入し、これはのみ行われますあなたのアプリケーションで一度。

新しいインスタンスを作成する必要がある場合は、該当するタイプの関連オブジェクトを作成するためにmap.get(string).create()を呼び出します。

編集:コードで小さな例:
あなたのクラスは、次のとおりです。

public static class MyBase { 
    @Override 
    public String toString() { 
     return "Base"; 
    } 
} 
public static class Class1 extends MyBase { 
    @Override 
    public String toString() { 
     return "Class1"; 
    } 
} 
public static class Class2 extends MyBase { 
    @Override 
    public String toString() { 
     return "Class2"; 
    } 
} 

そして、あなたの工場は次のようになります。

public static abstract class MyFactory { 
    public abstract MyBase build(); 
} 
public static class MyFactory1 extends MyFactory { 
    @Override 
    public Class1 build() { 
     return new Class1(); 
    } 
} 
public static class MyFactory2 extends MyFactory { 
    @Override 
    public Class2 build() { 
     return new Class2(); 
    } 
} 

は一度だけプログラム寿命のマップを移入:

Map<String,MyFactory> map = new HashMap<String, Test.MyFactory>(); 
    map.put("class1", new MyFactory1()); 
    map.put("class2", new MyFactory2()); 

と、新しいオブジェクトが必要、との呼び出し:

MyBase obj = map.get(s).build(); 
    System.out.println(obj); 

(*)注:クラスの静的キーワードを私は内部クラスとしてそれらを作成したので、ここにある - もちろん、あなたはそれならば、それをOMMITする必要がありますあなたのケースではありません....

3

Java 7では、switch文に文字列を使用できるようになりました。

コードの構造を調べるだけで、理論的には3つのファクトリメソッドすべてを呼び出すことができるため、コードはswitchステートメントと直接的には似ていないことに注意してください(例:elseステートメントなし)。しかし実際には、stringは同時に3つの値をすべて持つことができないので、起こることはありません。

+0

スイッチステートメントを使用すると、読みやすさとユーザビリティの点ではさらに優れていますか?私はまだ 'if'sの代わりに' case'を持っていることを除いて、大量のコードを1つの場所に持っています – Simiil

+0

あなたが求めているものに正確に依存します!私はその問題を、文字列処理に関するものと解釈しました(それは主題が意味するものなので)。それ以外は、全体的なデザイン、パターンなどについて解釈しています。 – dty

+0

つまり、デザインの観点からは、重要なことを改善する。 – dty

0

私は機能的で読みやすいとおもいます。文字列がnullとその方法は間違いなく、それが簡単に参照し、防ぐことができるよう

"Information1".equals(strings) 

はおそらく、情報1、情報2、およびInformation3はクラスの静的変数として置くことができ、代わりに次のことを考慮し、NPEをスローします呼び出すことであれば:-)人間のタイプミス。

+0

よだ、あなたです! – dty

+0

別の新しいニックル、今日! – Jasonw

0

Java 7ではswitchステートメントを新しく使用できます。here

0

最初のチェックまたは2番目のチェックが真であるかどうかチェックするために、スイッチケースを使用する方が良い。 デフォルトセクションでは、例外スローなどの他のアクティビティを配置することができます。

関連する問題