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
       }
}

有没有更好的模式呢?我可以更进一步,让抽象类属性扩展另一个类(用抽象类扩展另一个类甚至可以吗)?让所有类都扩展相同的模式会更好吗?

提前致谢!

4

2 回答 2

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 回答
0

您拥有的是工厂,但它不是工厂方法模式。

为此,您将拥有多个工厂类,它们继承自AttributeFactory(现在是抽象的)和 override createAttribute

然后在运行时您可以使用正确的具体工厂。

它不能替代您在这里拥有的东西,但希望能告诉您不同之处。

我建议您查看依赖注入框架,以通过字符串名称而不是重复if..then块来解析实例。

至于返回类型的接口,这是可取的。总是更喜欢接口而不是抽象类。维持阶级继承需要付出努力并限制你的选择。请记住,组合优于继承。

于 2012-12-14T00:05:30.683 回答