たとえば、抽象クラス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)
のような静的バージョンもありますが、明らかにそれは真の工場として再利用可能ではなく、やや優雅ではないようです。
このアイデアを表現する良い方法はありますか?
これの目的は何ですか?あなたは一般的にインスタンスとsetModelを作成しようとしていますか?何か不足していますか?また、最終目標を説明する簡単な例(Employeeなど)を追加するとよいでしょう。 – developer
@javaguy基本的な目的は、モデルをクラス参照で要素に変換することです。例えば、データベースクエリまたは休息コールはモデルを返すので、ファクトリは、そのモデルからの任意のサブクラスの要素を作成する簡単な方法である。 – momo