2016-11-29 107 views
1

假设我有一个抽象类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),但显然它不是一个可重用的真正的工厂,似乎不太优雅。

有没有更好的方式来表达这个想法?

+0

这是什么目的?你正尝试创建一个实例和setModel?我错过了什么吗?另外,如果添加一个简单示例(如Employee等)来解释最终目标,那将会很好。 – developer

+0

@javaguy的基本目的是通过类引用将模型转换为元素。例如,数据库查询或休息调用返回一个模型,所以工厂将是一个简单的方法来创建该模型中任意子类的元素。 – momo

回答

1

由于通用类型被擦除,所以您必须将ElementSubclass传递给工厂,这是没有办法的。

如果你被new ElementFactory<ElementSubclass>(ElementSubclass.class)所激怒,那么写一个通用的静态方法,如public static <E extends Element> ElementFactory<E> of(Class<E> elementClass)。这会给你像这样的代码:

ElementFactory<ElementSubclass> factory = ElementFactory.of(ElementSubclass.class); 

这感觉好一点。

+0

是的,这就是我最终结束的地方,或者非常接近(在倒数第二段中引用的静态方法)。感谢您的确认。 – momo