Tenho lido sobre o design pattern Singleton e me deparei com uma situação que gerou-me uma dúvida. Eis meu código:
<?php
abstract class Singleton
{
private static $_instance = array();
public static function getInstance($class_name, $identifier = null)
{
if (!empty($identifier)) {
if (!isset(self::$_instance[$class_name][$identifier])) {
self::$_instance[$class_name][$identifier] = new $class_name($identifier);
}
return self::$_instance[$class_name][$identifier];
}
if (!isset(self::$_instance[$class_name])) {
self::$_instance[$class_name] = new $class_name;
}
return self::$_instance[$class_name];
}
abstract public static function factory($identifier = null);
public function __clone()
{
throw new BadMethodCallException('Clone is not allowed.');
}
public function __wakeup()
{
throw new BadMethodCallException('Deserializing is not allowed.');
}
}
class A extends Singleton
{
protected function __construct()
{
// init
}
public static function factory($identifier = null)
{
return parent::getInstance(__CLASS__, $identifier);
}
}
class B extends Singleton
{
private $_identifier = null;
protected function __construct($identifier)
{
$this->_identifier = $identifier;
}
public static function factory($identifier = null)
{
return parent::getInstance(__CLASS__, $identifier);
}
public function getIdentifier()
{
return $this->_identifier;
}
}
$A = A::factory();
$B1 = B::factory('foo');
print $B1->getIdentifier(); // Saída: foo
$B2 = B::factory('bar');
print $B2->getIdentifier(); // Saída: bar
?>Neste caso, a propriedade privada Singleton::$_instance teria a seguinte estrutura:Array ( [A] => A Object ( ) [B] => Array ( [foo] => B Object ( [_identifier:private] => foo ) [bar] => B Object ( [_identifier:private] => bar ) ) )Minha dúvida é: esta utilização do padrão Singleton é válida? Ou eu, aqui, estou quebrando alguma "regra"?
Obrigado,
[]s











