2016-11-29 180 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