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 Até mais