Patrones

Patrones

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.

Factory

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

Singleton

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

?>