Los patrones son formas de describir las mejores prácticas y los
buenos diseños. Estos muestran una solución flexible a los
problemas comunes de programación.
El patrón Factory permita la instancia de objetos en tiempo de
ejecución. Es llamado el patrón Factory puesto que es
responsable de "manufacturar" un objeto.
Ejemplo 19-23. Método Factory
<?php class Example { // The factory method public static function &factory($type) { if (include_once 'Drivers/' . $type . '.php') { $classname = 'Driver_' . $type; return new $classname; } else { throw new Exception ('Driver not found'); } } } ?>
|
Al definir este método en una clase se nos permite que los
drivers sean cargados al vuelo. Si la clase Example
fuera una clase de abstracción de base de datos, cargar un
manejador de MySQL y SQLite
podría ser hecho como sigue:
<?php // Load a MySQL Driver $mysql = Example::factory('MySQL');
// Load a SQLite Driver $sqlite = Example::factory('SQLite'); ?>
|
|
El patrón Singleton aplica a situaciones en las cuales hay la
necesidad de ser una sola instancia de una clase. El ejemplo más
común de esto es una conexión de base de datos.
Implementando este patrón permite a un programador hacer esta
simple isntancia fácilmente accesible a muchos otros objetos.
Ejemplo 19-24. Función Singleton
<?php class Example { // Hold an instance of the class private static $instance; // A private constructor; prevents direct creation of object private function __construct() { echo 'I am constructed'; }
// The singleton method public static function singleton() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; }
return self::$instance; } // Example method public function bark() { echo 'Woof!'; }
// Prevent users to clone the instance public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); }
}
?>
|
Esto permite que se obtenga una simple instancia de la clase
Example.
<?php // This would fail because the constructor is private $test = new Example;
// This will always retrieve a single instance of the class $test = Example::singleton(); $test->bark();
// This will issue an E_USER_ERROR. $test_clone = clone($test);
?>
|
|