2010-10-05 6 views
2

Je les classes de suivi (C# par exemple)Design Pattern pour objet unique par système d'identification

class A 
{ 
    private static Dictionary<int, A> idLookup; 
    .... 
    private A(id) {...} 
    public static A Get(id) 
    { 
     //does some magic 
     if (...) { return idLookup[id]; } 
     else { A a = new A(id); idLookup[a.id] = a; return a; } 
    } 
} 

class B 
{ 
    private static Dictionary<int, B> idLookup; 
    .... 
    private B(id) {...} 
    public static B Get(id) 
    { 
     //does some magic 
     if (...) { return idLookup[id]; } 
     else { B b = new B(id); idLookup[b.id] = b; return b; } 
    } 
} 
... and so on 

Y at-il un modèle de conception (faisait l'héritage, mais qui a été un peu en désordre) qui peut supprimer tout ce qui double code?

La fonctionnalité ci-dessus garantit que seule une instance de A/B/... existe pour un identifiant.

+0

Ce n'est pas beaucoup de code en double. Vous pourriez écrire un dictionnaire plus spécialisé pour le rendre plus facile, alors ce serait un one-liner. –

+0

donc c'est un programme à un seul thread, je suppose? –

+0

@Kirk Wool, oui ... ce truc va échouer assez spectaculairement dans le code multi-thread. – jameszhao00

Répondre

3

Utiliser des génériques. Code/PseudoCode:

class UniquePattern<T> 
{ 
    private static Dictionary<int, T> idLookup; 
    .... 
    private T(id) {...} 
    public static T Get(id) 
    { 
     ... 
    } 
} 
+2

Il y a une contrainte de type 'où T: new()' pour un constructeur sans paramètre, mais il n'y a pas de contraintes de ce type pour les constructeurs avec des paramètres spécifiques ... ie 'où T: new (int)' n'est pas valide C#. - Cela dit, les génériques semblent être la voie à suivre ici. – stakx

+0

chaque fois que je redécouvre la syntaxe "où" et chaque fois que je suis étonné :) @stakx oww j'ai parlé trop vite, puis – samy

+0

Oui, vous avez raison. J'avais utilisé new() mais j'étais surpris qu'il ne supporte pas le constructeur paramétrable. Je l'ai enlevé. – Aliostad

Questions connexes