1

属性を定期的に追加したいのですが、他の場所で属性を生成するためのコードを変更する必要はありません。そのため、ファクトリ メソッドであると思われる次のコードを思いつきました。

    //sudo code:
interace Attributes {  //should this be an abstract class instead?
   getFields();
       //possibly more items,
}

class RangeAttribute implements Attributes
{
    getFields()
    {
        return array('field1', 'field2');
    }
}
class MatchAttribute implements Attributes
{
    getFields()
    {
        return array('fieldA', 'field2', 'fieldB');
    }
}

class AttributeFactory {  // is this section the 'factory'
    public Attributes createAttribute(String type) {
    if (item.equals("Range")) {
        return new RangeAttribute();
    } else if (item.equals("Match")) {
        return new MatchAttribute();
    } else
        return null;
}



//main
AttributeFactory attrFact = new AttributeFactory();
Attributes attribute = attrFact.createAttribute(dropdown.selection);
foreach (str in attribute.getFields())
    print str; //more complex irl

まず、これはファクトリ メソッドの正しい実装ですか。次に、ファクトリ メソッドとテンプレート メソッドを次のようなものに組み合わせることができますか。

abstract class Attributes {  //should this be an abstract class instead?
abstract getFields();
//possibly more items,
renderFields() {
            foreach (str in attribute.getFields())
        print str; //more complex irl
       }
}

これにはより良いパターンがありますか?それをさらに進めて、抽象クラス Attributes で別のクラスを拡張できますか (別のクラスを抽象クラスで拡張しても問題ありませんか)? すべてのクラスが同じパターンを拡張する方がよいでしょうか?

前もって感謝します!

4

2 に答える 2

0

あなたが持っているのは Factory ですが、それは Factory Method パターンではありません。

そのためには、AttributeFactory(現在は抽象)から継承し、オーバーライドする複数のファクトリクラスがありますcreateAttribute

その後、実行時に正しい具象ファクトリを使用できます。

ここにあるものに代わるものではありませんが、違いがわかることを願っています.

if..then繰り返しブロックではなく文字列名でインスタンスを解決するには、依存性注入フレームワークを検討することをお勧めします。

返される型のインターフェイスに関しては、それが望ましいです。常に抽象クラスよりもインターフェイスを優先します。クラスの階層を維持するには労力がかかり、選択肢が制限されます。継承よりも構成を忘れないでください。

于 2012-12-14T00:05:30.683 に答える
0

Javaで列挙型を使用してみてください。デモンストレーション用のサンプル ファクトリ

 public enum EnumButtonFactory {

RADIO(RadioButton.class),
SUBMIT(SubmitButton.class),
NORMAL(NormalButton.class);

private Class<? extends Button> button;

EnumButtonFactory(Class<? extends Button> b) {
    this.button = b;
}

public Button get() {
    try {
        return button.newInstance();
    } catch (InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}
}

使用法:

     button = EnumButtonFactory.NORMAL.get();
    button.click();
于 2013-01-31T08:29:37.810 に答える