modèle de constructeur
Builder Pattern utilise plusieurs objets simples pour construire un objet complexe étape par étape. Ce type de modèle de conception est un modèle de création qui offre une manière optimale de créer des objets.
Une classe Builder construira l'objet final étape par étape. La classe Builder est indépendante des autres objets.
Introduction
Intention : Séparer une construction complexe de sa représentation, afin que le même processus de construction puisse créer différentes représentations.
Solution principale : Solution principale : Dans les systèmes logiciels, nous sommes parfois confrontés à la création d'un "objet complexe", qui est généralement composé de sous-objets de chaque partie utilisant un certain algorithme ; en raison de Les différentes parties de cet objet complexe sont souvent confrontées à des changements drastiques à mesure que les exigences changent, mais les algorithmes qui les rassemblent sont relativement stables.
Quand utiliser : Lorsque certains composants de base ne changent pas, mais que leur combinaison change fréquemment.
Comment résoudre : Séparez le changement de l'immuabilité.
Code clé : Builder : crée et fournit des instances, directeur : gère les dépendances des instances construites.
Exemples d'application : 1. Lorsque vous allez chez KFC, les hamburgers, le cola, les frites, les ailes de poulet frites, etc. sont les mêmes, mais leurs combinaisons changent fréquemment, générant un so- appelé "repas fixe". 2. StringBuilder en JAVA.
Avantages : 1. Le constructeur est indépendant et facile à agrandir. 2. Contrôlez facilement les risques détaillés.
Inconvénients : 1. Les produits doivent avoir quelque chose en commun et la portée est limitée. 2. Si les changements internes sont complexes, il y aura de nombreuses classes de construction.
Scénarios d'utilisation : 1. Les objets qui doivent être générés ont des structures internes complexes. 2. Les propriétés internes des objets à générer sont interdépendantes.
Remarque : La différence avec le mode usine est que le mode constructeur accorde plus d'attention à l'ordre d'assemblage des pièces.
Mise en œuvre
Nous supposons une analyse de rentabilisation d'un restaurant de restauration rapide, où un repas typique peut être un hamburger et une boisson fraîche. Les hamburgers peuvent être des hamburgers végétariens ou des hamburgers au poulet, et ils sont emballés dans des cartons. Les boissons froides peuvent être du Coca ou du Pepsi, présentées en bouteilles.
Nous allons créer une interface Item et une classe d'entité qui implémente l'interface Item pour représenter les produits alimentaires (tels que les hamburgers et les boissons froides), et un <🎜 pour représente l'interface >Packing d'emballage alimentaire et la classe d'entité Packing d'implémentation de l'interface, les hamburgers sont emballés dans des cartons et les boissons froides sont emballées dans des bouteilles.
Ensuite, nous créons une classeMeal avec un ArrayList de Item et un Item en le combinant pour créer différents Objet Repas de type MealBuilder. BuilderPatternDemo, notre classe de démonstration utilise MealBuilder pour créer un Repas.
Étape 1
Créez une interface qui représente les produits alimentaires et les emballages alimentaires.
Item.java
public interface Item { public String name(); public Packing packing(); public float price(); }
Packing.java
public interface Packing { public String pack(); }
Étape 2
Créer une interface qui implémente la classe d'entité Packing.
Wrapper.java
public class Wrapper implements Packing { @Override public String pack() { return "Wrapper"; } }
Bottle.java
public class Bottle implements Packing { @Override public String pack() { return "Bottle"; } }
Étape 3
Créer une implémentation de Interface d'élément Une classe abstraite qui fournit des fonctionnalités par défaut.
Burger.java
public abstract class Burger implements Item { @Override public Packing packing() { return new Wrapper(); } @Override public abstract float price(); }
ColdDrink.java
public abstract class ColdDrink implements Item { @Override public Packing packing() { return new Bottle(); } @Override public abstract float price(); }
Étape 4
Créer une extension de Classe d'entité de Burger et ColdDrink.
VegBurger.java
public class VegBurger extends Burger { @Override public float price() { return 25.0f; } @Override public String name() { return "Veg Burger"; } }
ChickenBurger.java
public class ChickenBurger extends Burger { @Override public float price() { return 50.5f; } @Override public String name() { return "Chicken Burger"; } }
Coke.java
public class Coke extends ColdDrink { @Override public float price() { return 30.0f; } @Override public String name() { return "Coke"; } }
Pepsi.java
public class Pepsi extends ColdDrink { @Override public float price() { return 35.0f; } @Override public String name() { return "Pepsi"; } }
Étape 5
Créez une classe Meal avec l'objet Item défini ci-dessus.
Meal.java
import java.util.ArrayList; import java.util.List; public class Meal { private List<Item> items = new ArrayList<Item>(); public void addItem(Item item){ items.add(item); } public float getCost(){ float cost = 0.0f; for (Item item : items) { cost += item.price(); } return cost; } public void showItems(){ for (Item item : items) { System.out.print("Item : "+item.name()); System.out.print(", Packing : "+item.packing().pack()); System.out.println(", Price : "+item.price()); } } }
Étape 6
Créez une classe MealBuilder, la classe de constructeur réelle est responsable de la création de l'objet Meal.
MealBuilder.java
public class MealBuilder { public Meal prepareVegMeal (){ Meal meal = new Meal(); meal.addItem(new VegBurger()); meal.addItem(new Coke()); return meal; } public Meal prepareNonVegMeal (){ Meal meal = new Meal(); meal.addItem(new ChickenBurger()); meal.addItem(new Pepsi()); return meal; } }
Étape 7
BuiderPatternDemo Utilisez MealBuider pour démontrer le modèle Builder.
BuilderPatternDemo.java
public class BuilderPatternDemo { public static void main(String[] args) { MealBuilder mealBuilder = new MealBuilder(); Meal vegMeal = mealBuilder.prepareVegMeal(); System.out.println("Veg Meal"); vegMeal.showItems(); System.out.println("Total Cost: " +vegMeal.getCost()); Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); System.out.println("\n\nNon-Veg Meal"); nonVegMeal.showItems(); System.out.println("Total Cost: " +nonVegMeal.getCost()); } }
Étape 8
Vérifiez la sortie.
Veg Meal Item : Veg Burger, Packing : Wrapper, Price : 25.0 Item : Coke, Packing : Bottle, Price : 30.0 Total Cost: 55.0 Non-Veg Meal Item : Chicken Burger, Packing : Wrapper, Price : 50.5 Item : Pepsi, Packing : Bottle, Price : 35.0 Total Cost: 85.5