Salut,
Vu que les combinaisons d'ingrédients et de leur nombre peuvent être multiples et très variés, au lieu de faire un constructeur à Recette comme tu l'as fait (ou une série de constructeurs, pour un ingrédient, 2, 3...), tu pourrais faire une fabrique sous forme de motif constructeur :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class RecetteBuilder {
public RecetteBuilder() {
}
public RecetteBuilder add(Ingredient ingredient, int nombre) { // Ingredient étant par exemple une interface commune à toutes les classes d'ingrédients
/*...*/
}
public Recette create() {
/*...*/
}
} |
Ce qui te permettra de faire :
Recette recette = new RecetteBuilder().add(ingredien1, n1).add(ingredient2, n2).add....create();
Tu peux par exemple mettre cette classe dans le même package que Recette, et mettre un constructeur de visibilité package, par exemple avec une Map comme la indiqué @freddou17 :
1 2 3 4 5 6 7 8 9
| public class Recette {
private Map<Ingredient, Integer> ingredients;
Recette(Map<Ingredient, Integer> ingredients) {
this.ingredients=ingredients;
}
} |
La Map sera construite et remplie par l'instance de RecetteBuilder. Par exemple, à chaque add, on peut faire :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
public class RecetteBuilder {
private final Map<Ingredient, Integer> map;
public RecetteBuilder() {
map = new HashMap<>();
}
public RecetteBuilder add(Ingredient ingredient, int nombre) { // Ingredient étant par exemple une interface commune à toutes les classes d'ingrédients
map.compute(ingredient, (i,n)-> n==null?nombre:n+nombre);
}
public Recette create() {
return new Recette(map);
}
} |
Partager