Origen / Explicación de Class :: getInstance?

Soy bastante nuevo en la herencia clásica, ya que principalmente me ocupo de ECMAScript y Python, aunque hago un poco de (temblor) PHP. Sé que está fuertemente influenciado por Java y otros lenguajes basados ​​en herencia clásica.

Pregunta:

Estaba echando un vistazo a algunas clases en un marco y noté que la palabra clave ‘nueva’ no se llamaba (al menos directamente) para crear una instancia, sino que se usaba el método público getInstance para crear el objeto inicial.

¿Alguien puede explicar la estrategia detrás de esto? ¿Y cuándo debería usarlo para mis propias clases?

Código relevante:

class FrontController { public static $_instance; public static function getInstance() { if ( !(self::$_instance instanceof self) ) { self::$_instance = new self(); } return self::$_instance; } } $front = FrontController::getInstance(); $front->route(); echo $front->getBody(); 

Código completo:

 class FrontController { protected $_controller, $_action, $_params, $_body, $_url; public static $_instance; public static function getInstance() { if ( ! ( self::$_instance instanceof self) ) { self::$_instance = new self(); } return self::$_instance; } private function __construct() { $this->uri = uri::getInstance(); if ( $this->uri->fragment(0) ) { $this->_controller = $this->uri->fragment(0).'Controller'; } else { $config = config::getInstance(); $default = $config->config_values['application']['default_controller'].'Controller'; $this->_controller = $default; } if ( $this->uri->fragment(1) ) { $this->_action = $this->_uri->fragment(1); } else { $this->_action = 'index'; } } public function route() { $con = $this->getController(); $rc = new ReflectionClass( $con ); if ( $rc->implementsInterface( 'IController' ) ) { $controller = $rc->newInstance(); if ( $rc->hasMethod( $this->getAction() ) ) { $method = $rc->getMethod( $this->getAction() ); } else { $config = config::getInstance(); $default = $config->config_values['application']['default_action']; $method = $rc->getMethod( $default ); } $method->invoke( $controller ); } else { throw new Exception('Interface iController must be implemented'); } } public function getController() { if ( class_exists( $this->_controller ) ) { return $this->_controller; } else { $config = config::getInstance(); $default = $config->config_values['application']['error_controller'].'Controller'; return $default; } } public function getAction() { return $this->_action; } public function getBody() { return $this->_body; } public function setBody( $body ) { $this->_body = $body; } } 

Es bastante simple. Parece, muy parecido al pensamiento de Zend Framework?
De todos modos, esto implementa el patrón de diseño de Singleton. Está prohibiendo al progtwigdor crear más de una instancia del controlador. Entonces, ¿tiene acceso a su controlador desde cualquier lugar de su código, en lugar de crear un nuevo FrontController o algo así, simplemente solicita que se le proporcione la instancia One que se creó anteriormente.

Si no existe ninguna instancia, está creando otra, solo le devuelve el controlador frontal que se creó anteriormente.

¡Espero que esto te ayude!

getInstance() viene del patrón Singleton . Básicamente usas esto cuando quieres instanciar no más de una instancia de una clase.