Das Singleton Pattern

Da ich mich seit Langem mit Entwurfsmustern (Design-Patterns) beschäftige, habe ich mich entschlossen Codebeispiele hier zu veröffentlichen und diese zum besseren Verständnis zu beschreiben.

Hier die Implementierung des Singleton Patterns in PHP.

 final class Singleton {

   // Statische Variable welche die Instanz hält
   private static $instance = NULL;

   // Konstruktor private, damit die Klasse nur aus sich selbst heraus instanziiert werden kann
   private function __construct() {}

   // Anlegen und zurückgeben der Instanz
   public static function getInstance() {

       if (self::$instance === NULL) {
           self::$instance = new self;
       }
       return self::$instance;
   }

   // Verhindert das Clonen von außen
   private function __clone() {}
 }

 $singleton = Singleton::getInstance();

Häufig wird dieses Singleton eingesetzt um eine Datenbank Verbindung über einen zentralen Zugriffspunkt zu steuern. Hier auch der Beispielcode, wie ich eine solche Implementierung realisiert habe:

require_once 'Zend/Db.php';
require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
require_once 'Zend/Registry.php';

class Wsmm_Core_Data
{
    /**
     * @var        array
     */
    private static $_adapters;

    /**
     * Singleton. Connects to the database.
     *
     * @return     Zend_Db_Adapter_Pdo_Mysql
     */
    public static function getAdapter($db = 'default')
    {
        if (isset(self::$_adapters[$db]) == false) {
            try {
                //lesen der Konfiguration aus den Settings und erzeugen des Adapters
                self::$_adapters[$db] = new Zend_Db_Adapter_Pdo_Mysql(Zend_Registry::get('config')->db->$db);
                self::$_adapters[$db]->setFetchMode(Zend_Db::FETCH_OBJ);
                self::$_adapters[$db]->getConnection()->exec("SET NAMES 'utf8'");
            } catch (Exception $e) {
                //error handling
            }
        }

        return self::$_adapters[$db];
    }
}