假設我有一個抽象類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