假设我有一个抽象类Element
和一个接口Model
。泛型和工厂模式
Element
有一个方法setModel(Model model)
。
说Element
实例引用单个Model
实现的实例一般,对于像从静止反序列化,序列化到SQL元组等
每Element
子类是联想与一个特定Model
,但任何Model
可能与有关任何数量的Element
类的,所以像这样:
public abstract class Element<M extends Model> {
private M mModel;
public void setModel(M model) {
mModel = model;
}
}
而且
public interface Model {
// .. stuff
}
现在让我们说我想创建一个从模型中生成元素的工厂。鉴于模型可能与许多Element类相关联,我们可以期望我们需要提供特定的类。因此,像这样的最终结果是:
ElementSubclass e = new ElementFactory(ElementSubclass.class).from(someModelInstance);
或....
ElementFactory factory = new ElementFactory(ElementSubclass.class);
for(Model model : listOfModels) {
ElementSubClass element = factory.from(model);
listOfElementSubClassInstances.add(element);
}
入门一直存在那么直接比我还以为。我已经结束了的东西,如:
public class ElementFactory {
private Class<? extends Element> mElementClass;
public <E extends Element> ContentModelElementFactory(Class<E> elementClass) {
mElementClass = elementClass;
}
public <E extends Element> E from(Model model) {
try {
Element e = mElementClass.newInstance();
e.setModel(model);
return (E) e;
} catch (Exception ex) {
//
}
return null;
}
}
似乎有点不稳,和皮棉抱怨都调用setModel
和上线投下方。
我曾考虑类似new ElementFactory<ElementSubclass>(ElementSubclass.class)
的东西,但是读起来很糟糕 - 我们已经指定了一次元素子类,看起来像是一个类型和一个参数一样严格。
还有静态版本,如public static <E extends Element> E create(Class<E> clazz, Model model)
,但显然它不是一个可重用的真正的工厂,似乎不太优雅。
有没有更好的方式来表达这个想法?
这是什么目的?你正尝试创建一个实例和setModel?我错过了什么吗?另外,如果添加一个简单示例(如Employee等)来解释最终目标,那将会很好。 – developer
@javaguy的基本目的是通过类引用将模型转换为元素。例如,数据库查询或休息调用返回一个模型,所以工厂将是一个简单的方法来创建该模型中任意子类的元素。 – momo