Aller au contenu

Correction de certains TP de la semaine 3

TP 1 – Factory Pattern (Univers : Cuisine / Pizzeria) pour changer

Classe Pizza :

package fr.mer.gestion.semaine3.factory;

public abstract class Pizza {
	
    protected String nom;
    protected double prix;

    public Pizza(String nom, double prix) {
        this.nom = nom;
        this.prix = prix;
    }

    /**
     * Méthode abstraite à écrire dans les sous-classes.
     */
    public abstract void afficher();
}

Classe PizzaFromages :

package fr.mer.gestion.semaine3.factory;

public class PizzaFromages extends Pizza {
	
    public PizzaFromages() {
        super("4 Fromages", 11.99);
    }

    @Override
    public void afficher() {
        System.out.println(nom + " - Prix : " + prix + "€ (Mozzarella, Gorgonzola, Parmesan, Chèvre)");
    }
}

Classe PizzaMargherita :

package fr.mer.gestion.semaine3.factory;

public class PizzaMargherita extends Pizza {
    public PizzaMargherita() {
        super("Margherita", 8.99);
    }

    @Override
    public void afficher() {
        System.out.println(nom + " - Prix : " + prix + "€ (Tomate, Mozzarella, Basilic)");
    }
}

Classe PizzaReine :

package fr.mer.gestion.semaine3.factory;

public class PizzaReine extends Pizza {
    public PizzaReine() {
    	
        super("Reine", 10.99);
    }

    @Override
    public void afficher() {
    	
        System.out.println(nom + " - Prix : " + prix + "€ (Tomate, Mozzarella, Jambon, Champignons)");
    }
}

Classe PizzaFactory :

package fr.mer.gestion.semaine3.factory;

class PizzaFactory {

	/**
	 * Méthode de la Factory pour créer des Pizzas
	 * @param type
	 * @return Pizza
	 * @throws ExceptionPizzaIntrouvable 
	 */
	public static Pizza creerPizza(String type) throws ExceptionPizzaIntrouvable {

		var typePizza = type.toUpperCase();

		if ("MARGHERITA".equals(typePizza)) {
			return new PizzaMargherita();
		} else if ("REINE".equals(typePizza)) {
			return new PizzaReine();
		} else if ("4_FROMAGES".equals(typePizza)) {
			return new PizzaFromages();
		} else {
			throw new ExceptionPizzaIntrouvable(typePizza);
		}
	}
}

Classe Main :

J’ai ajouté une Pizza Végétarienne qui n’existe pas en ajoutant une Exception pour la traiter.

package fr.mer.gestion.semaine3.factory;

import java.util.ArrayList;
import java.util.List;

public class Main {

	public static void main(String[] args)
	{
		PizzaService service = new PizzaService();
		
		List<Pizza> pizzas_commandees = new ArrayList<>();

		// liste des types de pizza à commander...
		String[] typesPizzas = {"Margherita", "Reine", "4_Fromages", "Végétarienne"};

		for (String type : typesPizzas) {
			try {
				Pizza pizza = service.creerUnePizzaSelonSonType(type);
				pizzas_commandees.add(pizza);
			}
			catch (ExceptionPizzaIntrouvable e)
			{
				System.out.println(e.getMessage());
			}
		}

		// affichage des pizzas commandées
		for (Pizza pizza : pizzas_commandees) {
			pizza.afficher();
		}
	}
}

Classe ExceptionPizzaIntrouvable :

package fr.mer.gestion.semaine3.factory;

public class ExceptionPizzaIntrouvable extends Exception {

	/**
	 * Méthode pour gérer l'exception spécifique
	 * @param typeSouhaite
	 */
	public ExceptionPizzaIntrouvable(String typeSouhaite) {
		
		super("Désolé, ce type de Pizza "+ typeSouhaite+" n'existe pas encore !");
	}
}

TP 2 – Singleton Pattern (Logger)

Partie A

Classe Logger :

public class Logger {
    public void log(String message) {
        System.out.println("LOG: " + message);
    }
}

Classe main :

public class Main {
    public static void main(String[] args) {
        Logger logger1 = new Logger();
        Logger logger2 = new Logger();

        System.out.println("logger1 : " + logger1);
        System.out.println("logger2 : " + logger2);
        // Affiche deux références différentes
    }
}

Partie B (avec Singleton)

Classe Logger :

public class Logger {
    private static Logger instance; // Unique instance

    private Logger() {} // Constructeur privé

    public static Logger getInstance() {
        if (instance == null) {
            instance = new Logger();
        }
        return instance;
    }

    public void log(String message) {
        System.out.println("LOG: " + message);
    }
}

Classe Main :

public class Main {
    public static void main(String[] args) {
        Logger logger1 = Logger.getInstance();
        Logger logger2 = Logger.getInstance();

        System.out.println("logger1 : " + logger1);
        System.out.println("logger2 : " + logger2);
        // Affiche la même référence

        logger1.log("Début de l'application");
        logger2.log("Fin de l'application");
    }
}

TP 3 – DAO Pattern (Bibliothèque)

Classe Livre :

public class Livre {
    private int id;
    private String titre;
    private String auteur;

    public Livre(int id, String titre, String auteur) {
        this.id = id;
        this.titre = titre;
        this.auteur = auteur;
    }

    // Getters et setters
    public int getId() { return id; }
    public String getTitre() { return titre; }
    public String getAuteur() { return auteur; }

    @Override
    public String toString() {
        return id + " - " + titre + " (" + auteur + ")";
    }
}

Interface LivreDAO :

import java.util.List;

public interface LivreDAO {
    void save(Livre livre);
    Livre findById(int id);
    List<Livre> findAll();
    boolean deleteById(int id);
}

Classe LivreDAOMemory :

import java.util.ArrayList;
import java.util.List;

public class LivreDAOMemory implements LivreDAO {
    private List<Livre> livres = new ArrayList<>();
    private int nextId = 1;

    @Override
    public void save(Livre livre) {
        if (livre.getId() == 0) {
            livre = new Livre(nextId++, livre.getTitre(), livre.getAuteur());
        }
        livres.add(livre);
    }

    @Override
    /**
     * Méthode qui permet en programmation fonctionnelle de simplifier la recherche d'un livre.
     * return Livre
     */
    public Livre findById(int id) {
        return livres.stream()
                .filter(l -> l.getId() == id)
                .findFirst()
                .orElse(null);
    }

    @Override
    public List<Livre> findAll() {
        return new ArrayList<>(livres);
    }

    @Override
    public boolean deleteById(int id) {
        return livres.removeIf(l -> l.getId() == id);
    }
}

Classe BibliothequeService :

import java.util.List;

public class BibliothequeService {
    private LivreDAO livreDAO;

    public BibliothequeService(LivreDAO livreDAO) {
        this.livreDAO = livreDAO;
    }

    public void ajouterLivre(Livre livre) {
        livreDAO.save(livre);
    }

    public Livre trouverLivreParId(int id) {
        return livreDAO.findById(id);
    }

    public List<Livre> listerLivres() {
        return livreDAO.findAll();
    }

    public boolean supprimerLivre(int id) {
        return livreDAO.deleteById(id);
    }
}

Classe Main (pour tester) :

public class Main {
    public static void main(String[] args) {

        LivreDAO livreDAO = new LivreDAOMemory();
        BibliothequeService service = new BibliothequeService(livreDAO);

        // Ajouter des livres
        service.ajouterLivre(new Livre(1, "Le Petit Prince", "Antoine de Saint-Exupéry"));
        service.ajouterLivre(new Livre(2, "1984", "George Orwell"));
        service.ajouterLivre(new Livre(3, "Harry Potter", "J.K. Rowling"));

        // Afficher tous les livres
        System.out.println("Liste des livres :");
        service.listerLivres().forEach(System.out::println);

        // Rechercher un livre
        Livre livre = service.trouverLivreParId(2);
        System.out.println("\nLivre trouvé : " + livre);

        // Supprimer un livre
        service.supprimerLivre(1);
        System.out.println("\nListe après suppression :");
        service.listerLivres().forEach(System.out::println);
    }
}

TP 4 – Builder Pattern (Configuration d’ordinateur)

Classe Ordinateur :

package fr.mer.gestion.semaine3.builder;

public class Ordinateur {
   
    private String processeur;
    private String ram;             //  "16 Go"
    private String stockage;        // "512 Go SSD"
    private String carteGraphique;  // Optionnelle
    private String systeme;         //  "Windows 11"

    // constructeur privé (seul le Builder peut l'appeler)
    private Ordinateur() {}

    // getters (optionnels, pour accéder aux attributs si nécessaire)
    public String getProcesseur() { return processeur; }
    public String getRam() { return ram; }
    public String getStockage() { return stockage; }
    public String getCarteGraphique() { return carteGraphique; }
    public String getSysteme() { return systeme; }

    // Afficher la configuration
    public void afficherConfiguration() {
        System.out.println("--- Configuration de l'ordinateur ---");
        System.out.println("Processeur : " + processeur);
        System.out.println("RAM : " + ram);
        System.out.println("Stockage : " + stockage);
        System.out.println("Carte graphique : " + (carteGraphique != null ? carteGraphique : "Intégrée"));
        System.out.println("Système d'exploitation : " + systeme);
        System.out.println("--------------------------------------");
    }

    // classe interne : Builder
    public static class Builder {
    	
    	// on instancie bien notre ordinateur
        private Ordinateur ordinateur = new Ordinateur();

        // les méthodes pour définir chaque attribut (retournent this pour l'enchaînement)
        public Builder avecProcesseur(String processeur) {
            ordinateur.processeur = processeur;
            return this;
        }

        public Builder avecRam(String ram) {
            ordinateur.ram = ram;
            return this;
        }

        public Builder avecStockage(String stockage) {
            ordinateur.stockage = stockage;
            return this;
        }

        public Builder avecCarteGraphique(String carteGraphique) {
            ordinateur.carteGraphique = carteGraphique;
            return this;
        }

        public Builder avecSysteme(String systeme) {
            ordinateur.systeme = systeme;
            return this;
        }

        // méthode pour construire l'objet final
        public Ordinateur build() {
            // Validation minimale (exemple : processeur et RAM obligatoires)
            if (ordinateur.processeur == null || ordinateur.ram == null) {
                throw new IllegalStateException("Processeur et RAM sont obligatoires !");
            }
            return ordinateur;
        }
    }
}

Classe Main :

package fr.mer.gestion.semaine3.builder;

public class MainOrdinateur {

	public static void main(String[] args) {
		// PC bureautique simple
		Ordinateur pcBureautique = new Ordinateur.Builder()
				.avecProcesseur("Intel Core i5")
				.avecRam("8 Go")
				.avecStockage("256 Go SSD")
				.avecSysteme("Windows 10")
				.build();

		// PC gamer
		Ordinateur pcGamer = new Ordinateur.Builder()
				.avecProcesseur("AMD Ryzen 7")
				.avecRam("32 Go")
				.avecStockage("1 To SSD")
				.avecCarteGraphique("NVIDIA RTX 4080")
				.avecSysteme("Windows 11")
				.build();

		// PC sans carte graphique
		Ordinateur pcSansCG = new Ordinateur.Builder()
				.avecProcesseur("Intel Core i3")
				.avecRam("4 Go")
				.avecStockage("500 Go HDD")
				.avecSysteme("Linux")
				.build();

		// affichage des configurations
		pcBureautique.afficherConfiguration();
		pcGamer.afficherConfiguration();
		pcSansCG.afficherConfiguration();
	}
}

ordinateurBuilder