Mein Plan ist es, ein ControlPanelFactory
zu haben, die ein maßgeschneidertes ControlPane
für jede der verschiedenen Model
Klassen bauen:Fabrikmuster und Polymorphie
abstact class Model {
}
class ModelA extends Model {
}
class ModelB extends Model {
}
Jetzt ist mein Plan, die Factory-Klasse zu haben, war die unterschiedlichen ControlPane
Instanzen erzeugt basierend auf die Model
Klasse, die mit der Methode Überlastung übergeben wurde:
class ControlPaneFactory {
private ControlPaneFactory() {
}
public static ControlPanel build(ModelA model) {
return new ControlPaneA(model);
}
public static ControlPanel build(ModelB model) {
return new ControlPaneB(model);
}
}
dies ist jedoch sehr problematisch, da beim Aufruf der factorys Methode, ich habe nur eine Vari Typ Model
, so würde ich zuerst instanceof
verwenden müssen, das ist ein riesiger Codesmell. Die gleichen apllies zu einer kondensierten Factory-Methode mit:
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");
}
Ich dachte über eine ENUM in den Modellklassen usign, die die Art von Model
angeben würden, aber dies scheint auch wie eine schlechte Option, die DRY verletzen würde.
Zusätzlich wäre es mir viel lieber, wenn die Instanz ControlPane
unabhängig (d. H. In einer speziellen Klasse) der Model
Klassen wäre. Gibt es einen "netten" Weg, dieses Problem zu lösen?
Die Instantiierung der 'ControlPane' in die entsprechenden' Model' Klassen wäre die naheliegende Lösung, aber wie Sie gesagt haben, erhöht dies die Kopplung zwischen Ansicht und Modell, was ich zu vermeiden versuche. Abstract Factory wäre sicher zu viel. Ich habe mich nur gefragt, ob es eine offensichtliche und elegante Lösung gibt, die gelöst werden könnte, aber es scheint, als würde man das 'ControlPanel' vom' Model' entkoppeln wollen, wird es immer etwas geben, das sich nicht sehr elegant anfühlt. – Marv