Design patterns: Singleton

data: · 2 min
autore: Mauto
serie: Design Patterns/ parte 2/24

I pattern classici della Gang of Four, uno per puntata, con esempi pratici in PHP.

  1. Design Patterns
  2. Design patterns: Singleton
  3. Design patterns: Factory Method
  4. Design patterns: Abstract Factory
  5. Design patterns: Builder
  6. Design patterns: Prototype
  7. Design patterns: Adapter
  8. Design patterns: Bridge, cos’è e come usarlo (esempio PHP)
  9. Design patterns: Composite
  10. Design patterns: Decorator
  11. Design patterns: Facade, cos’è e come usarlo (esempio PHP)
  12. Design patterns: Flyweight
  13. Design patterns: Proxy
  14. Design patterns: Chain of Responsibility, cos’è (esempio PHP)
  15. Design patterns: Command
  16. Design patterns: Interpreter
  17. Design patterns: Iterator
  18. Design patterns: Mediator
  19. Design patterns: Memento
  20. Design patterns: Observer
  21. Design patterns: State, cos’è e come usarlo (esempio PHP)
  22. Design patterns: Strategy
  23. Design patterns: Template Method
  24. Design patterns: Visitor
tutta la guida >

Il Singleton Pattern è un pattern creazionale utilizzato per garantire che una classe abbia una sola istanza e fornisca un punto di accesso globale a questa istanza. Questo pattern è utile in situazioni in cui avere più istanze di una classe potrebbe causare problemi, occupare troppe risorse o non avere senso.

Caratteristiche del pattern singleton

  1. Costruttore privato: Impedisce la creazione di più istanze della classe
  2. Metodo statico getInstance(): Verifica se esiste già un’istanza della classe; se non esiste, ne crea una nuova.
  3. Unica istanza: Ogni volta che viene chiamato getInstance(), restituisce sempre la stessa istanza, garantendo che ce ne sia soltanto una.
  4. Clonazione e deserializzazione proibite: Il pattern blocca la clonazione e la deserializzazione, impedendo la duplicazione dell’istanza singleton.

Esempio in PHP:

class Singleton {
    private static $instance;

    // Il costruttore è privato per impedire l'uso di "new"
    private function __construct() {} 

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
    
    // Evita la clonazione dell'istanza
    private function __clone() {}

    // Evita la deserializzazione dell'istanza (da PHP 8 __wakeup deve essere pubblico)
    public function __wakeup() {
        throw new \Exception("Un singleton non può essere deserializzato");
    }
}

// Utilizzo
$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();

echo $instance1 === $instance2 ? "Stessa istanza" : "Istanze diverse";

Caso d’uso frequente

Immagina di sviluppare un’applicazione che interagisca con un database. Aprire una connessione al database è costoso e, se ogni componente ne apre una propria, si rischiano problemi di performance, di gestione delle risorse o addirittura errori. In questo contesto, il Singleton è utile perché garantisce che ci sia una sola connessione al database aperta.

TORNA ALLA GUIDA

Copiato