Je suis en train de développer une application qui, à un certain moment donne à l'utilisateur la possibilité d'ajouter un attribut à un enregistrement qu'il crée, cet attribut peut être une chaine de caractère (je programme en Java donc c’est un String) où bien c’est un numérique (Double). J’ai opté pour la création d’une factory qui utilise l’interface Attribut qui est elle, est implémentée par mes mes deux classes concrètes AttributNumérique et AttributTexte. La Factory comprenait un block if pour identifier l’objet à créer.
Plus tard, le besoin a évolué et j’ai eu besoin de donner la possibilité d’ajouter comme classe concrète un Booléen, trouvant le bloc if assez lourd et ne voulant pas modifier le code à chaque ajout de nouvelle classe j’ai utilisé la reflexion pour trouver la bonne classe. Pour une création manuelle ça a été bien, mais lors d’un import massif depuis le PGI j’ai commencé à remarquer que les lenteurs commençaient à ne plus être négligeables.
Est-ce que vous connaissez un moyen autre que le bloc if then else et la reflexion pour déterminer la classe concrète à instancier?
J’ai cherché des façons d’implémentation et dans un site j’ai trouvé 3 méthodes, les deux que j’ai utilisé plus une troisième que je n’arrive pas à comprendre, voici le code utilisé
J’avoue ne pas avoir compris la méthode utilisée, quelqu’un peut m’aider à comprendre ça?
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 abstract class Product { public abstract Product createProduct(); ... } class OneProduct extends Product { ... static { ProductFactory.instance().registerPhoneCall("ID1", new OneProduct()); } public OneProduct createProduct() { return new OneProduct(); } ... } class ProductFactory { public void registerPhoneCall(String productID, Product p) { m_PhoneCallClasses.put(productID, p); } public Product createProduct(String productID){ ((Product)m_RegisteredProducts.get(productID)).createProduct(); } }
Partager