私の計画は、異なるModel
クラスごとにカスタマイズControlPane
を構築しますControlPanelFactory
を持つことです:私の計画は、ベースの異なるControlPane
インスタンスを作成するファクトリクラスを持っていた今 Factoryパターンと多型は、
abstact class Model {
}
class ModelA extends Model {
}
class ModelB extends Model {
}
メソッドのオーバーロードで可決された
Model
クラス上:factorysメソッドを呼び出すときに、私は唯一のバリを持っているので、
class ControlPaneFactory {
private ControlPaneFactory() {
}
public static ControlPanel build(ModelA model) {
return new ControlPaneA(model);
}
public static ControlPanel build(ModelB model) {
return new ControlPaneB(model);
}
}
しかし、これは、非常に問題がありますタイプModel
であることができるので、最初にinstanceof
を使用する必要があります。これは、巨大なコードマレットです。凝縮ファクトリメソッド持つと同じapllies:私はModel
の種類を指定しますモデルクラス内の列挙型をusignについて考え
public static ControlPane build(Model model) {
if (model instanceof ModelA)
return new ControlPaneA(model);
else if (model instanceof ModelB)
return new ControlPaneB(model);
else throw new IllegalArgumentException("Unsupported model");
}
が、しかし、これはまた、DRYに違反する不正なオプションのように思えます。
さらに、私は、ControlPane
クラスの独立した(すなわち、spererateクラスの)クラスのインスタンス化をすることを好むでしょう。この問題を解決する "良い"方法はありますか?
'ControlPane'のインスタンス化をそれぞれの' Model'クラスに移すことは明白な解決策ですが、あなたが言ったように、これは避けようとしているビューとモデルの間の結合を増やします。抽象的な工場は確かに過度のものになるでしょう。明白でエレガントな方法があるのかどうか疑問に思っていましたが、 'Model'から' ControlPanel'を分離したい場合は、常にエレガントではないものがあります。 – Marv