Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 18-01-2008, 02:35
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Question Abstrakter Singleton

Bisher habe ich das Singleton Entwurfsmuster wie folgt implementiert:
PHP-Code:
class Test
{
    public static function 
get_instance()
    {
        static 
$instance null;

        if (!isset(
$instance))
        {
            
$instance = new self;
        }

        return 
$instance;
    }

    protected function 
__construct();

    final private function 
__clone();
}

$test Test::get_instance(); 
Jetzt denke ich über eine abstrakte Implementierung nach, damit nicht in jede Klasse mit Singleton-Funktionalität die als protected bzw. final private deklarierten __construct und __clone Methoden gestopft werden müssen.
PHP-Code:
abstract class Singleton
{
    private static 
$_instances = array();

    final public static function 
get_instance($class)
    {
        if (!isset(
self::$_instances[$class]))
        {
            
$object = new $class();

            if (!(
$object instanceof Singleton))
            {
                throw new 
SingletonException(
                    
sprintf(
                        
'The class %s does not inherit from Singleton',
                        
$class
                    
)
                );
            }

            
self::$_instances[$class] = $object;
        }

        return 
self::$_instances[$class];
    }

    protected function 
__construct();

    final private function 
__clone();
}

class 
Test extends Singleton
{
}

$test Singleton::get_instance('Test'); 
Die Nachteile sind allerdings unschön:
Falls die von Singleton abgeleitete Klasse eine Kindklasse hat, die ebenfalls von Sinelton erben soll, wirds problematisch. Unter Umständen müsste wieder eine get_instance()-Methode implementiert werden, womit der abstrakte Ansatz an Zweckmäßigkeit verliert. Darüber hinaus sehe ich keine Möglichkeit, einer Klasse nicht nur eine Instanz, sondern eine begrenze Anzahl von Instanzen zu erlauben.

Habt ihr da Ideen oder Erfahrungen, das praktischer umzusetzen?

Geändert von Griecherus (18-01-2008 um 02:59 Uhr)
Mit Zitat antworten