J'utilise la bibliothèque Java, core
, avec AbstractFactory
responsable des composants de l'interface utilisateur. MyApplication utilise le noyau et personnalise l'interface utilisateur. C'est pourquoi, lors du démarrage de MyApplication, je définis MyFactory comme une instance d'AbstractFactory.
class AbstractFactory {
...
public static AbstractFactory getInstance();
public abstract JButon createButton();
public abstract JLabel createLabel();
...
}
class MyFactory extends AbstractFactory {
...
}
MyApplication.startup() {
AbstractFactory.setInstance(new MyFactory())
}
Mon problème est que je dois créer, par exemple, JList dans MyApplication, mais je ne peux pas ajouter public JList createJList()
dans AbstractFactory, car je ne peux pas modifier la bibliothèque de base.
Que dois-je faire ?
Premier cas : Toujours appeler MyFactory.getMyFactoryInstance()
dans MyApplication, nouveau champ statique.
class MyFactory extends AbstractFactory {
private static MyFactory myInstance = new MyFactory();
public static getMyFactoryInstance() { return myInstance }
...
}
Deuxième cas : Toujours appeler MyFactory.getMyFactoryInstance()
dans MyApplication, utiliser le cast
class MyFactory extends AbstractFactory {
public static MyFactory getMyFactoryInstance() {
if (getInstance() instanceOf MyFactory) {
return (MyFactory) getInstance();
}
throw Exception();
}
...
}
Troisième cas : Utiliser deux usines. Pour JButtons et JLabels, utilisez AbstractFactory, pour JList utilisez SomeOtherFactory.
JButton button = AbstractFactory.getInstance().createButton();
JList list = SomeOtherFactory.getInstance.createList();
Quatrième cas : Quelque chose de mieux ? J'ai l'impression d'avoir oublié quelque chose.