Menu
Coddy logo textTech

Patron Singleton

Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 65 sur 87.

Le Singleton Pattern est un patron de conception de création qui garantit qu’une classe ne possède qu’une seule instance dans toute votre application, tout en fournissant un point d’accès global à cette instance. Cela est utile pour les ressources qui doivent être partagées, comme les gestionnaires de configuration, les pools de connexions ou les services de journalisation.

Le modèle fonctionne en rendant le constructeur privé, ce qui empêche l’instanciation directe. À la place, une méthode statique contrôle l’accès à l’instance unique :

public class DatabaseConnection {
    private static DatabaseConnection instance;
    
    // Le constructeur privé empêche l'instanciation directe
    private DatabaseConnection() {
        System.out.println("Connection created");
    }
    
    // Point d'accès global
    public static DatabaseConnection getInstance() {
        if (instance == null) {
            instance = new DatabaseConnection();
        }
        return instance;
    }
    
    public void query(String sql) {
        System.out.println("Executing: " + sql);
    }
}

Chaque appel à getInstance() renvoie le même objet. L’instance est créée uniquement lorsqu’elle est demandée pour la première fois. C’est ce qu’on appelle l’initialisation différée :

DatabaseConnection db1 = DatabaseConnection.getInstance();
DatabaseConnection db2 = DatabaseConnection.getInstance();

System.out.println(db1 == db2);  // true - same instance

Les composants clés d’un Singleton sont : un champ private static contenant l’instance, un constructeur private et une méthode public static qui renvoie l’instance. Cette combinaison garantit que, quel que soit le nombre de fois où vous demandez l’objet, vous obtenez toujours le même.

challenge icon

Défi

Facile

Construisons un gestionnaire de configuration pour une application en utilisant le modèle Singleton ! Votre gestionnaire de configuration garantira que toutes les parties de votre application partagent les mêmes paramètres, quel que soit le nombre de fois où elles y demandent l'accès.

Vous organiserez votre code sur deux fichiers :

  • AppConfig.java : Créez une classe Singleton qui gère les paramètres de configuration de l'application. Votre AppConfig doit comporter :

    Un champ statique privé pour contenir l'unique instance.

    Un champ privé de type String appelé appName et un champ privé de type int appelé maxUsers.

    Un constructeur privé qui initialise appName à "MyApplication" et maxUsers à 100, puis affiche AppConfig initialized.

    Une méthode statique publique getInstance() qui crée l'instance uniquement si elle n'existe pas encore (initialisation différée), puis la renvoie.

    Une méthode setAppName(String name) qui met à jour le nom de l'application.

    Une méthode setMaxUsers(int max) qui met à jour le nombre maximal d'utilisateurs.

    Une méthode displaySettings() qui affiche App: [appName], Max Users: [maxUsers].

  • Main.java : Démontrez que votre Singleton fonctionne correctement ! Vous recevrez deux entrées : un nouveau nom d'application (String) et une nouvelle valeur pour le nombre maximal d'utilisateurs (entier).

    Commencez par obtenir une instance de AppConfig et stockez-la dans une variable appelée config1. Appelez displaySettings() pour afficher les valeurs par défaut.

    Mettez ensuite à jour les paramètres à l'aide de vos valeurs d'entrée en appelant setAppName et setMaxUsers sur config1.

    Obtenez une autre instance et stockez-la dans config2. Appelez displaySettings() sur config2 pour prouver qu'elle reflète les modifications effectuées via config1.

    Enfin, affichez si les deux références pointent vers le même objet : Same instance: [true/false] en comparant config1 == config2.

Vous recevrez deux entrées dans l'ordre suivant : le nouveau nom d'application (String), puis la nouvelle valeur pour le nombre maximal d'utilisateurs (entier).

Ce défi démontre l'avantage fondamental du modèle Singleton : quel que soit le nombre de fois où vous demandez la configuration, vous obtenez toujours la même instance avec le même état partagé !

Essayez vous-même

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lire les entrées
        String newAppName = scanner.nextLine();
        int newMaxUsers = scanner.nextInt();
        
        // TODO: Obtenir la première instance de AppConfig et la stocker dans config1
        
        // TODO: Appeler displaySettings() sur config1 pour afficher les valeurs par défaut
        
        // TODO: Mettre à jour les paramètres en utilisant setAppName et setMaxUsers sur config1
        
        // TODO: Obtenir une autre instance et la stocker dans config2
        
        // TODO: Appeler displaySettings() sur config2 pour prouver que les modifications sont partagées
        
        // TODO: Afficher si les deux références pointent vers le même objet :
        // "Same instance: [true/false]" using config1 == config2
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation Orientée Objet

Entraînez-vous par vous-même : Compilateur Java en ligne