07 novembre 2008

Come creare un Singleton in Java o Php

Il Singleton è un design pattern creazionale, il suo scopo è assicurare che una classe abbia una sola istanza e fornire un punto di accesso globale a tale istanza. Questo può essere usato ad esempio per caricare delle informazione da database e gestirle durante tutto il flusso dell'applicazione senza doverle necessariamente ricaricare. Un suo utilizzo ponderato può renderne l'utilizzo davvero vantaggioso.

Guardiamo un esempio di Singleton in Java. Il codice presenta un metodo opzionale : invalidate
che invalida la prima istanza della classe, forzandone la creazione di una nuova istanza nel successivo accesso alla classe.
public class Singleton {
private static Singleton instance;

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

public static void invalidate(){
instance = null;
// si possono invalidare eventuali altre proprietà della classe
}

private Singleton(){
// qui si eseguono le eventuali operazioni di inizializzazione delle informazioni necessarie
}
}

Ecco un implementazione alternativa in PHP.
/**
* Semplice implementazione del design pattern singleton.
* Data la struttura sintattica di PHP non è possibile sfruttare l'ereditarietà
* per poter riutilizzare il pattern, se non utilizzando piccoli stratagemmi sintattici.
*/
class MySingleton
{
/**
* La variabile statica privata che conterrà l'istanza univoca
* della nostra classe.
*/
private static $instance = null;

/**
* Il costruttore in cui ci occuperemo di inizializzare la nostra
* classe. E' opportuno specificarlo come privato in modo che venga
* visualizzato automaticamente un errore dall'interprete se si cerca
* di istanziare la classe direttamente.
*/
private function __construct()
{
// ... codice ...
}

/**
* Il metodo statico che si occupa di restituire l'istanza univoca della classe.
* per facilitare il riutilizzo del codice in altre situazioni, si frutta la
* costante __CLASS__ che viene valutata automaticamente dall'interprete con il
* nome della classe corrente (ricordo che "new $variabile" crea un'istanza della classe
* il cui nome è specificato come stringa all'interno di $variabile)
*/
public static function getInstance()
{
if(self::$instance == null)
{
$c = __CLASS__;
self::$instance = new $c;
}

return self::$instance;
}
}

Nessun commento: