Bisher habe ich das Singleton Entwurfsmuster wie folgt implementiert:
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.
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?
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();
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');
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?
Kommentar