2012-11-22 4 views
4

L'un des avantages de la méthode des usines statiques stipule que:Usines méthodes statiques

Contrairement constructeurs ils peuvent renvoyer un objet d'un sous-type de leur type de retour qui vous donne une grande flexibilité dans le choix de la classe d'objet retourné.

Qu'est-ce que cela signifie exactement? Quelqu'un peut-il expliquer cela avec du code?

Répondre

5
public class Foo { 
    public Foo() { 
     // If this is called by someone saying "new Foo()", I must be a Foo. 
    } 
} 

public class Bar extends Foo { 
    public Bar() { 
     // If this is called by someone saying "new Bar()", I must be a Bar. 
    } 
} 

public class FooFactory { 
    public static Foo buildAFoo() { 
     // This method can return either a Foo, a Bar, 
     // or anything else that extends Foo. 
    } 
} 
+0

Voici l'avantage d'avoir une seule méthode d'usine Si je voulais qu'une variable d'objet de type parent contienne un objet du type de la sous-classe, je peux demander à un constructeur de la sous-classe de générer quel est le problème. Je ne comprends pas comment cela pourrait être un chose utile à faire. –

+0

@ david.colais Ce lien a une longue liste avec des explications sur les différents avantages: http://my.safaribooksonline.com/book/programming/java/9780137150021/creating-and-destroying-objects/ch02lev1sec1 –

1

Permettez-moi de briser votre question en deux parties
(1) Contrairement constructeurs peuvent renvoyer un objet d'un sous-type de leur type de retour
(2) qui vous donne une grande flexibilité dans le choix de la classe d'objet retourné.
Disons que vous avez deux classes étendues de Player qui sont PlayerWithBall et PlayerWithoutBall

public class Player{ 
    public Player(boolean withOrWithout){ 
    //... 
    } 
} 

//... 

// What exactly does this mean? 
Player player = new Player(true); 
// You should look the documentation to be sure. 
// Even if you remember that the boolean has something to do with a Ball 
// you might not remember whether it specified withBall or withoutBall. 

to 

public class PlayerFactory{ 
    public static Player createWithBall(){ 
    //... 
    } 

    public static Player createWithoutBall(){ 
    //... 
    } 
} 

// ... 

//Now its on your desire , what you want :) 
Foo foo = Foo.createWithBall(); //or createWithoutBall(); 

Ici, vous obtenez les deux réponsesFlexability et contrairement comportement constructeur Vous pouvez maintenant voir par ces méthodes d'usine Vous avez le type de lecteur dont vous avez besoin