2016-11-29 8 views
1

たとえば、抽象クラスElementとインタフェースModelがあります。汎用とファクトリパターン

Elementは、方法setModel(Model model)を持っています。

セイElementインスタンスが

など、SQLタプルにシリアライズ、残りの部分から逆シリアル化のようなもののために、一般的に単一Model実装のインスタンスを参照するすべての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 
} 

ここで、モデルから要素を生成するファクトリを作成したいとしましょう。 Modelが複数の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; 
    } 

} 

少し不安定なようだ、とlintは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

ええ、それは私も同様に終わった、またはかなり近くに(静的メソッドは、最後の段落の2番目に参照)です。確認してくれてありがとう。 – momo

関連する問題