我想定期添加属性,但不必更改代码以便在其他地方生成它们,所以我想出了以下我认为是工厂方法:
//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扩展另一个类(甚至可以使用抽象类扩展另一个类)?让所有类扩展相同的模式会更好吗?
提前致谢!
答案 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();