Bonjour,
je pense que cette question doit être régulièrement posée, mais voilà, j'ai besoin d'avoir un singleton basée sur une classe abstraite, et donc j'ai plusieurs implémentations.
Quel est le meilleur moyen, de faire une factory pour avoir un singleton ?
Pour le moment j'ai codé çà comme çà : mais j'aime pas vraiment ce que j'ai fait
J'ai 2 implémentations :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public abstract class CommHelper { private static final Logger LOGGER = Logger.getLogger(); private static CommHelper INSTANCE = null; public enum CommMode { SIMULATOR, CORBA; } private String commHelperName; protected CommHelper() { } protected CommHelper(String name) { setCommHelperName(name); LOGGER.info("CommHelper " + commHelperName + " initialized."); } private void setCommHelperName(String commHelperName) { this.commHelperName = commHelperName; } public static void initInstance(CommMode mode) throws CommInitException { switch(mode) { case SIMULATOR: INSTANCE = new Simulator(); break; case CORBA: INSTANCE = new Corba(); break; default: throw(new CommInitException("Unknonw Comm Mode !")); } INSTANCE.init(); } public static CommHelper getINSTANCE() { if(INSTANCE == null) { try { CommHelper.initInstance(CommMode.SIMULATOR); } catch(CommInitException e) { LOGGER.fatal("Erreur lors de l'initialisation : %s", e.getLocalizedMessage()); } } return INSTANCE; } public abstract void init() throws CommInitException; public boolean shutdown() { LOGGER.info("Comm shutdown."); return true; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class Corba extends CommHelper { private static final String NAME = "Corba"; public Corba() { super(NAME); } @Override public void init() throws CommInitException { // TODO :::: } @Override public boolean shutdown() { .... return super.shutdown(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public class Simulator extends CommHelper { private static final String NAME = "Simulator"; public Simulator() { super(NAME); } @Override public void init() throws CommInitException { // rien pour le simulateur } }
Donc çà me gène :
1 - parceque c'est pas thread safe, et j'aime pas l'init pas défaut dans le getinstance
2 - j'aimerais pouvoir initialiser le tout avec un truc du genre init("Corba") pour pouvoir ajouter des implémentations sans changer le code (donc un système de plugin, factory ?)
Désolé pour cette question ultra récurrente, merci d'avance.
Partager