2010-01-23 7 views
1

J'ai rencontré plusieurs classes qui ne permettent pas la création de leur instance directement. Nous devons plutôt créer leur instance à partir de la méthode statique d'une autre classe ou de sa propre méthode statique. Par exemple:Pourquoi certaines classes restreignent-elles l'instanciation directe?

B b = A.getB(); 

ou

B b = B.getInstance(); 

Quelle raison est derrière cela?

Pourquoi ne pas permettent de créer par exemple directement, comme dans:

B b = new B(); 

Répondre

7

Certaines classes veulent contrôler la façon dont elles sont instanciées et ainsi protéger leurs constructeurs contre l'utilisation publique. Utilisez des méthodes d'usine statiques comme getInstance leur permet de garder ce contrôle dans leur propre code.

Il y a un million de raisons de vouloir le faire.

modifier: Pour répondre à votre commentaire, cela ne peut être fait à l'intérieur du constructeur, car l'opérateur new sera toujours créer une nouvelle instance (à moins qu'une exception est levée). Au moment où le constructeur est appelé, il est trop tard pour que le code dans le constructeur contrôle si un objet est instancié ou non.

+0

+1 Pourriez-vous s'il vous plaît me dire pourquoi nous ne pouvons pas écrire ce code de contrôle dans le constructeur lui-même. –

+0

Voir les réponses aux questions. – skaffman

4

Ce sont un exemple de la Singleton Pattern. Ils ont généralement méthode de constructeur privé, mais dans l'exemple j'ai lié ils ont utilisé protégé pour empêcher l'instanciation.

Les classes abstraites ne pourraient pas non plus être instanciées.

+3

Ou FactoryPattern. –

+0

+1 pour le lien –

1

Lorsque les objets ont une logique de création complexe, les délégués de créateurs création d'objets à specific objects Ceci est en accord à l'single responsibility principle: l'objectif est de permettre à l'objet d'ignorer les structures et procédures nécessaires à sa création.

Sans utiliser d'Usine, la création d'objets complexes nécessiterait de longs opérateurs avec trop de paramètres. Dans le cas getInstance(), le concepteur voulait qu'une seule instance d'un objet soit accessible à travers son application: c'est le Singleton pattern et c'est l'équivalent d'une variable globale.

1

Les deux sont des implémentations de creational patterns, c'est-à-dire des modèles qui traitent des mécanismes de création d'objet, en essayant de créer des objets d'une manière adaptée à la situation.

  • Le premier exemple ressemble à l'Factory method pattern: Définir une interface pour créer un objet, mais laissez-les sous-classes de décider quelle classe à instancier. Factory Method permet à une classe de différer l'instanciation des sous-classes [Gof].

  • Le deuxième exemple est le Singleton pattern: fabrique qui ne peut créer qu'une seule instance d'une classe.

Ils ne permettent pas de créer une instance directement avec un new parce qu'ils sont précisément destinées à contrôler comment la création est fait pour résoudre un problème particulier: restreindre instanciation d'une classe à un objet pour le singleton, laisser les sous-classes décider de la classe à instancier pour l'usine.

1

Quelques cas d'utilisation:

  1. Avec le modèle d'usine que l'interface de l'objet sera visible, la mise en œuvre lui-même peut être changé et par choisies en usine.
  2. La méthode createInstance fait un travail supplémentaire dans les coulisses qui ne peut se faire dans le cteur
  3. La classe peut utiliser un Singleton pour cet objet et renvoie toujours la même instance
Questions connexes