2009-08-20 5 views
1
class XFactory { 

    private XFactory() {} 

    static void getX() { 
    if(...) 
     return new A(new XFactory()); 
    else 
     return new B(new XFactory()); 
    } 

} 

class A { 
    private A() {} 
    public A(XFactory xf) {} 
} 

class B { 
    private B() {} 
    public A(XFactory xf) {} 
} 

De cette façon, je peux m'assurer que seule Factory peut créer des instances de ses classes d'appartenance.S'assurer que seule l'usine peut créer une instance

Est-ce une bonne approche ou existe-t-il une autre approche/une bonne approche?

Répondre

2

L'approche commune (en C++) consiste à rendre privés les constructeurs de classes d'appartenance et à déclarer la classe de fabrique friend.

1

Je ferais des classes A et B des amis de XFactory, et garderais tous leurs constructeurs privés. Par conséquent, seule XFactory a accès à leurs constructeurs.

C'est-à-dire en C++. En Java ou en C#, je ne vois pas de moyen propre d'imposer cela à la compilation. Votre exemple est loin d'être infaillible et même un peu confus, puisque tant que l'on a une instance de XFactory, il peut le passer au constructeur de A ou B et l'instancier directement comme ça.

+0

personne ne peut créer une instance de XFactory. bcoz son constructeur est privé. – Prabu

1

Si vous étiez pour hacks et ne pouvait pas faire vos constructeurs privés, vous pouvez: Faites votre usine un singleton global et de créer un objet:

  • Créer une clé aléatoire
  • Ajouter cette clé à une liste privée dans l'objet usine des clés en cours d'utilisation
  • Transmettre la clé au constructeur
  • Demander au constructeur de récupérer l'objet usine global et l'appeler pour valider la clé.
  • Si la validation de la clé échoue, mettez votre programme hors service (appelez exit, die, ... tout ce qui est approprié). Ou peut-être envoyer un paquet de cheminée à un administrateur. C'est le genre de chose qui devrait être pris rapidement.

(Dois-je obtenir des points pirater?) Jacob

-1

En Java, vous pouvez faire les constructeurs privés et de fournir l'usine sous la forme d'une classe imbriquée publique, puisque les classes imbriquées ont accès aux députés de la classe dans laquelle ils sont déclarés. Toute personne qui le souhaitait pouvait créer une instance de ExampleClass.NestedFactory et à travers elle instancier ExampleClasses.

Je n'ai pas réussi à trouver un moyen de faire cela qui vous permette d'hériter de ExampleClass puisque le compilateur Java exige que vous spécifiiez un constructeur pour la superclasse ... donc c'est un inconvénient.

Questions connexes