2013-04-27 2 views
4

J'envisage d'utiliser le builder pattern afin de créer le complexe objects au sein de mon application. Cependant, je suis inquiet de savoir si c'est le bon modèle à utiliser.Utilisation correcte du modèle de générateur

Prendre this example; Ici, nous voyons plusieurs PizzaBuilders en cours de création qui fonctionne bien. Cependant, dans ma demande, j'ai besoin de pouvoir transmettre certaines informations relatives à ce qui est en cours de construction. Par exemple, dans le cas du PizzaBuilders, j'aurais besoin de la possibilité de créer un custom pizza où l'utilisateur peut choisir certaines choses comme le sauce et le toppings. Il convient de noter que les informations que je devrais transmettre aux constructeurs varieraient.

Pourriez-vous me dire si je cherche à utiliser le modèle correct pour ce problème ou s'il y a peut-être autre chose de mieux adapté? Si c'est le modèle correct pour le problème alors s'il vous plaît pourriez-vous conseiller sur le moyen le plus propre de transmettre l'information aux constructeurs? Serait-ce au moment de l'instanciation?

Répondre

2

Il semble que le modèle de construction soit ce dont vous avez besoin. Dans cet article wikipedia, nous pouvons voir différents constructeurs prédéfinis. Cependant, ce n'est pas la seule façon d'utiliser le pattern Builder.

Vous pouvez certainement créer des objets personnalisés avec lui et l'un de ses points forts est qu'il vous permet de créer des objets complexes atomiquement sans avoir à définir plusieurs constructeurs, ce qui conduit à plus de code maintanable. Gardez à l'esprit que s'il n'y a pas assez de complexité pour justifier l'utilisation de ce modèle, cela peut être exagéré.

Jetez un oeil à la description offerte de ce modèle dans Java efficace de Joshua Bloch pour une explication plus complète. Here's an article about it

0

Builder is not a grade A pattern, so it's tough to justify its usage sometime. And you might not find convincing reason to use it.

Il est utilisé si vous voulez vous assurer que votre construction de l'objet est atomique. Pensez à Java pour construire un objet bean en utilisant des méthodes setter. Dans ce cas, le problème est que, si vous ne définissez pas un attribut, l'objet ne sera PAS dans un état cohérent. Et il n'y a aucun moyen de comprendre cela à moins d'avoir un comportement d'application incohérent. Donc, vous devriez utiliser le pattern Builder quand il y a 3 attributs et que vous voulez que la création d'objets soit atomique. Je l'avais utilisé il y a quelque temps pour créer une URL REST comme BASE_URL/param1/param2/param3. Par conséquent, si votre exigence concerne la création/la construction d'un objet et que vous avez plusieurs attributs, vous pouvez opter pour ce modèle.

Modifier

En ce qui concerne la mise en œuvre; J'avais suivi la même approche que celle donnée sur wikipedia.

2

Par exemple, dans le cas des PizzaBuilders je aurais besoin la possibilité de créer une pizza personnalisée où l'utilisateur peut choisir certaines choses telles que la sauce et les garnitures

pouvez choisir - ces signifie des éléments facultatifs. Le modèle Builder serait parfait ici. Sauf si vous omettez quelque chose dans votre question.

2

Je suppose que vous pouvez utiliser quelque chose comme:

// normal pizza: 
Pizza normalPizza=PizzaBuilder.aPizza().withCheese().withSalami().build(); 

// custom pizza 
Pizza customPizza=PizzaBuilder.aCustomPizza().withAnchovis().withHotSauce().withExtraCheese().withoutGarlic().build(); 

Et ce que le constructeur ferait est interne à la mise en œuvre, tant que build() retourne un objet Pizza (ou une sous-classe appropriée). Vous pouvez également effectuer toute vérification de cohérence dans les méthodes with ... ou dans build().

Si vous avez besoin d'une sécurité de type pour les résultats, vous pouvez utiliser buildCustomPizza() pour retourner votre type de pizza personnalisé.