# Design patterns: Singleton

> Singleton design pattern con esempi in PHP

- URL: https://mautoblog.com/posts/design-patterns/singleton/
- Lingua: it
- Pubblicato: 2024-09-27
- Aggiornato: 2026-10-14
- Autore: Mauto
- Categorie: Sviluppo Software, Tecnologia
- Tags: Architettura Software, Best Practices, PHP
- Guida: Design Patterns (parte 2)
- Traduzione (en): https://mautoblog.com/en/posts/design-patterns/singleton/

---
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:
```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](/posts/design-patterns/)

