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);
?>
|
|