4

ファクトリーパターンを試してみたくて実装できたのですが、
複数のクラスを生成するとき、これは醜いだろうと思いました!! そのため、明確さや提案をいただければ幸いです...

私のスーパークラス:

public abstract class Output {

    public abstract void generate(Data dat); }

私は出力から拡張する他のクラスを取得しました

public class generateXML extends Output{
.
.
.
}

私の質問はここに関連しています:

public class generatorFactory(){

public Output generate(String str){   

// または (Object obj) のように引数としてオブジェクトを取得する

if(str.equals("xml"){  
return new generateXML();  
}  
else if.........  
......  
}

各タイプのチェックを回避して、サブクラスのタイプを判別できる方法はありますか??

4

5 に答える 5

2

if-else チェーンをマップに置き換えることを検討する必要があります。

サポートするすべての文字列をチェックするコードを記述する必要はなく、マップから要素を取得するための一連の行を用意するだけです。

もちろん、アイテムをマップに配置するには、さらに構成コードが必要になりますが、それは簡単なはずです。

これは、このトピックに関する素敵な投稿です(PHPで)

于 2012-09-04T08:06:07.153 に答える
1

newInstance()を使用して、パラメーターから作成したクラス名を持つジェネレーターをインスタンス化できます。

public Generator getGenerator (final String type)
{
    final Class generatorClass = ClassLoader.getSystemClassLoader().loadClass("Generator"+type);
    final Generator generator = (Generator) (generatorClass.newInstance());
     return generator;
}

PS:Javaのルールに従うことを高く評価します。generateXMLがクラスの場合は、GenerateXMLと記述する必要があります。

さらに:クラスに名前を付けて注意してください。(1)オブジェクトgenerateXMLは、出力ではないため、出力を拡張する必要があります。(2)「GenerateXML」は動詞、つまりアクションです。したがって、オブジェクトに名前を付けるのは正しい言葉ではなく、メソッドです。例ごとにオブジェクトに「XMLGenerator」という名前を付けることができます。

于 2012-09-04T11:35:55.387 に答える
1

ファクトリに渡すことができる which を使用enumして、渡された列挙型に基づいてファクトリ オブジェクトを返すことができます。唯一のことは、API としてエクスポートできないことです。

 enum Type
{
    XML {
        @Override
        public Object getFactory() {
            // TODO Auto-generated method stub
            return null;
        }
    };

    public abstract Object getFactory();
} 

APIのように公開する必要がある場合は、以下のようにすることができます。

interface IType {
    public abstract Object getTypeFactory();
}

enum Type implements IType {
    XML {
        @Override
        public Object getTypeFactory() {
            // TODO Auto-generated method stub
            return null;
        }
    };
}

Factory メソッドの実装を次のように変更します。

public static Object getFactoryByType(String name) {
    Type type = Type.valueOf(name);
    return type.getTypeFactory();
}
于 2012-09-04T08:06:47.180 に答える
1

リフレクションを使用できます。

Object generated = getClass().getMethod("generate" + type.toUpperCase()).invoke(this);

public Object generateXML();
public Object generateJSON();
public Object generateCSV();
于 2012-09-04T08:07:50.313 に答える
0

毎回呼び出す必要がnewあるため、分岐プロセスをバイパスできるかどうかはわかりません。誰かがあなたに何を返すかを知っている必要があります。

シングルトンの場合は、HashMap を初期化できます"xml"=>generateXML singleton

ただし、2 回目以降は、異なるTypeクラス MyTypeXML、MyTypeJSON の String 属性を変更してから、同じ名前で異なる型のメソッドを使用できます。

public Output generate(MyTypeXML xml) { // This will go for XML }
public Output generate(MyTypeJSON json) { // This will go for JSON }

しかし、工場に関しては、if...else コーディングに反対しているわけではありません。

于 2012-09-04T08:05:29.113 に答える