Pattern Builder
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 67 di 87.
Il Builder Pattern è un pattern di progettazione creazionale che risolve un problema comune: costruire oggetti complessi con molti parametri facoltativi. Invece di creare più costruttori o passare null per i parametri non utilizzati, il Builder ti permette di costruire gli oggetti passo dopo passo.
Considera di creare un oggetto User con campi obbligatori (nome, email) e facoltativi (età, telefono, indirizzo). Senza un Builder, dovresti usare costruttori telescopici o un costruttore poco pratico con molti parametri. Il pattern Builder offre un approccio più pulito:
public class User {
private final String name; // obbligatorio
private final String email; // obbligatorio
private final int age; // facoltativo
private final String phone; // facoltativo
private User(UserBuilder builder) {
this.name = builder.name;
this.email = builder.email;
this.age = builder.age;
this.phone = builder.phone;
}
public static class UserBuilder {
private final String name;
private final String email;
private int age;
private String phone;
public UserBuilder(String name, String email) {
this.name = name;
this.email = email;
}
public UserBuilder age(int age) {
this.age = age;
return this;
}
public UserBuilder phone(String phone) {
this.phone = phone;
return this;
}
public User build() {
return new User(this);
}
}
}I metodi di Builder restituiscono this, consentendo il concatenamento dei metodi: un modo scorrevole e leggibile per costruire oggetti:
User user = new User.UserBuilder("Alice", "alice@email.com")
.age(25)
.phone("555-1234")
.build();Nota che il costruttore User è privato: gli oggetti possono essere creati solo tramite il Builder. Questo schema è particolarmente utile quando gli oggetti hanno molti campi facoltativi, rendendo il codice più leggibile e meno soggetto a errori rispetto a lunghe liste di parametri.
Sfida
FacileCostruiamo un sistema per ordinare pizze usando il Builder Pattern! Invece di avere a che fare con un costruttore che accetta decine di parametri per tutti i possibili condimenti e le opzioni, creerai un builder fluente che rende la personalizzazione della pizza semplice e leggibile.
Organizzerai il codice in due file:
Pizza.java: crea una classePizzache usa il Builder Pattern per la costruzione. La pizza dovrà avere i seguenti campi:size(String) - obbligatorio, rappresenta la dimensione della pizzacheese(boolean) - facoltativo, il valore predefinito è falsepepperoni(boolean) - facoltativo, il valore predefinito è falsemushrooms(boolean) - facoltativo, il valore predefinito è falseIl costruttore di
Pizzadeve essere privato e accettare solo unPizzaBuildercome parametro, copiando tutti i valori dal builder ai campi della pizza.Includi un metodo
getDescription()che restituisce una stringa in questo formato:[size] Pizza with: [toppings], dove toppings è un elenco separato da virgole dei condimenti impostati su true (Cheese, Pepperoni, Mushrooms). Se non viene selezionato alcun condimento, la parte toppings deve riportare semplicementeno toppings.Crea una classe interna statica
PizzaBuildercon:- Un costruttore che accetta il parametro obbligatorio
size - I metodi
cheese(),pepperoni()emushrooms(), ognuno dei quali imposta il rispettivo booleano su true e restituiscethisper consentire il concatenamento - Un metodo
build()che restituisce una nuovaPizza
- Un costruttore che accetta il parametro obbligatorio
Main.java: mostra il funzionamento del tuo builder per le pizze! Riceverai quattro input: la dimensione della pizza (String) e tre valori sì/no (String) che indicano rispettivamente se aggiungere cheese, pepperoni e mushrooms.Crea un
PizzaBuildercon la dimensione specificata. Poi, in base a ciascun input sì/no, concatena i metodi appropriati per i condimenti. Se l'input è"yes", chiama il metodo corrispondente al condimento; se è"no", saltalo. Infine, chiamabuild()per creare la pizza.Stampa il risultato della chiamata a
getDescription()sulla pizza completata.
Riceverai quattro input nell'ordine seguente: dimensione (String), aggiungere cheese (String: "yes" o "no"), aggiungere pepperoni (String: "yes" o "no"), aggiungere mushrooms (String: "yes" o "no").
Ad esempio, con gli input Large, yes, no, yes, il tuo output sarebbe: Large Pizza with: Cheese, Mushrooms
Nota come il Builder Pattern ti permette di costruire pizze con qualsiasi combinazione di condimenti, senza dover creare costruttori separati per ogni possibilità!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi gli input
String size = scanner.nextLine();
String addCheese = scanner.nextLine();
String addPepperoni = scanner.nextLine();
String addMushrooms = scanner.nextLine();
// TODO: Crea un PizzaBuilder con la dimensione indicata
// TODO: Concatena i metodi per aggiungere i condimenti in base agli input yes/no
// TODO: Costruisci la pizza e stampa la sua descrizione
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online