Introducció al Patró Singleton

El patró Singleton és un dels patrons creacionals més coneguts i utilitzats en el desenvolupament de programari. La seva principal funció és assegurar que una classe tingui només una instància i proporcionar un punt d'accés global a aquesta instància.

Característiques del Patró Singleton

  1. Única Instància: Garanteix que només hi hagi una instància de la classe.
  2. Accés Global: Proporciona un punt d'accés global a aquesta instància.
  3. Control de la Creació: Controla la creació de l'objecte per evitar múltiples instàncies.

Avantatges del Patró Singleton

  • Control Centralitzat: Facilita el control centralitzat de recursos.
  • Reducció de Recursos: Evita la creació de múltiples instàncies, reduint així l'ús de recursos.
  • Facilitat d'Accés: Proporciona un punt d'accés global fàcilment accessible.

Desavantatges del Patró Singleton

  • Dificultat en les Proves: Pot dificultar les proves unitàries, ja que és difícil substituir la instància única.
  • Problemes de Concurrència: Pot presentar problemes en entorns multithreading si no es gestiona correctament.
  • Acoblament: Pot augmentar l'acoblament entre classes, ja que moltes dependran de la instància única.

Implementació del Patró Singleton

Exemple en Java

A continuació, es mostra una implementació bàsica del patró Singleton en Java:

public class Singleton {
    // Instància única de la classe
    private static Singleton instance;

    // Constructor privat per evitar la instanciació externa
    private Singleton() {}

    // Mètode públic per obtenir la instància única
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    // Mètode de demostració
    public void showMessage() {
        System.out.println("Hola des del Singleton!");
    }
}

Explicació del Codi

  1. Instància Única: La variable instance és una instància estàtica de la classe Singleton.
  2. Constructor Privat: El constructor és privat per evitar que altres classes puguin crear una nova instància de Singleton.
  3. Mètode getInstance: Aquest mètode retorna la instància única de la classe. Si la instància no existeix, la crea.
  4. Mètode de Demostració: showMessage és un mètode de demostració per mostrar un missatge.

Exemple en Python

A continuació, es mostra una implementació bàsica del patró Singleton en Python:

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def show_message(self):
        print("Hola des del Singleton!")

# Ús del Singleton
singleton = Singleton()
singleton.show_message()

Explicació del Codi

  1. Instància Única: La variable _instance és una instància estàtica de la classe Singleton.
  2. Mètode __new__: Aquest mètode controla la creació de la instància. Si _instance és None, crea una nova instància.
  3. Mètode de Demostració: show_message és un mètode de demostració per mostrar un missatge.

Exercicis Pràctics

Exercici 1: Implementació del Patró Singleton en C#

Implementa el patró Singleton en C# i crea un mètode que mostri un missatge.

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton Instance {
        get {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }

    public void ShowMessage() {
        Console.WriteLine("Hola des del Singleton!");
    }
}

// Ús del Singleton
class Program {
    static void Main(string[] args) {
        Singleton singleton = Singleton.Instance;
        singleton.ShowMessage();
    }
}

Solució

  1. Instància Única: La variable instance és una instància estàtica de la classe Singleton.
  2. Constructor Privat: El constructor és privat per evitar que altres classes puguin crear una nova instància de Singleton.
  3. Propietat Instance: Aquesta propietat retorna la instància única de la classe. Si la instància no existeix, la crea.
  4. Mètode de Demostració: ShowMessage és un mètode de demostració per mostrar un missatge.

Exercici 2: Singleton amb Multithreading en Java

Implementa el patró Singleton en Java assegurant que sigui segur en entorns multithreading.

public class ThreadSafeSingleton {
    private static volatile ThreadSafeSingleton instance;

    private ThreadSafeSingleton() {}

    public static ThreadSafeSingleton getInstance() {
        if (instance == null) {
            synchronized (ThreadSafeSingleton.class) {
                if (instance == null) {
                    instance = new ThreadSafeSingleton();
                }
            }
        }
        return instance;
    }

    public void showMessage() {
        System.out.println("Hola des del Singleton segur per a threads!");
    }
}

// Ús del Singleton
class Main {
    public static void main(String[] args) {
        ThreadSafeSingleton singleton = ThreadSafeSingleton.getInstance();
        singleton.showMessage();
    }
}

Solució

  1. Instància Única Volàtil: La variable instance és una instància estàtica i volàtil de la classe ThreadSafeSingleton.
  2. Constructor Privat: El constructor és privat per evitar que altres classes puguin crear una nova instància de ThreadSafeSingleton.
  3. Mètode getInstance: Aquest mètode retorna la instància única de la classe. Utilitza un bloc sincronitzat per assegurar que només una instància es crea en entorns multithreading.
  4. Mètode de Demostració: showMessage és un mètode de demostració per mostrar un missatge.

Resum

El patró Singleton és una solució efectiva per assegurar que una classe tingui només una instància i proporcionar un punt d'accés global a aquesta instància. Tot i que té avantatges com el control centralitzat i la reducció de recursos, també presenta desavantatges com la dificultat en les proves i els problemes de concurrència. La seva implementació pot variar segons el llenguatge de programació, però els principis bàsics es mantenen constants.

© Copyright 2024. Tots els drets reservats