在工厂方法模式中,是否可以抽象创建者而不是接口?

时间:2012-12-13 23:38:24

标签: design-patterns

我想定期添加属性,但不必更改代码以便在其他地方生成它们,所以我想出了以下我认为是工厂方法:

    //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扩展另一个类(甚至可以使用抽象类扩展另一个类)?让所有类扩展相同的模式会更好吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

为此你将有多个工厂类继承自AttributeFactory(现在是抽象的)并覆盖createAttribute

然后在运行时,您可以使用正确的混凝土工厂。

这不是你在这里所拥有的东西的替代品,但希望能告诉你不同之处。

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

对于返回类型的接口,这是更可取的。总是喜欢抽象类的接口。维持类heirachies需要付出努力并限制你的选择。记住,构成超过继承。

答案 1 :(得分: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();