Patrón de diseño: Abstract Factory
Este patrón nos permite crear objetos sin especificar directamente sus clases.
El diagrama de clases
Diagrama de clases Abstract Factory
Código Fuente
Código fuente Patrón de diseño Abstract Factory
<?php
/**
* @author Gastón (clubdesarrolladores.com)
* @copyright 2008
*/
abstract class AbstractInterfazFactory
{
abstract function CrearVentana($titulo);
abstract function CrearBoton($texto);
static function RecogerFactory($sistemaOperativo)
{
switch($sistemaOperativo)
{
case 'Linux':
return new LinuxFactory();
break;
case 'Windows':
return new WindowsFactory();
break;
}
}
}
class LinuxFactory extends AbstractInterfazFactory
{
function CrearVentana($titulo)
{
return new VentanaLinux($titulo);
}
function CrearBoton($texto)
{
return new BotonLinux($texto);
}
}
class WindowsFactory extends AbstractInterfazFactory
{
function CrearVentana($titulo)
{
return new VentanaWindows($titulo);
}
function CrearBoton($texto)
{
return new BotonWindows($texto);
}
}
?>
<?php
abstract class AbstractVentana
{
public $_sTitulo;
abstract function MostrarVentana();
}
class VentanaLinux extends AbstractVentana
{
function __construct($titulo)
{
$this->_sTitulo = $titulo;
echo 'Creada Ventana Linux'."<br>";
}
function MostrarVentana()
{
echo 'Mostrada Ventana Linux: '.$this->_sTitulo."<br>";
}
}
class VentanaWindows extends AbstractVentana
{
function __construct($titulo)
{
$this->_sTitulo = $titulo;
echo 'Creada Ventana Windows'."<br>";
}
function MostrarVentana()
{
echo 'Mostrada Ventana Windows: '.$this->_sTitulo."<br>";
}
}
<?php
abstract class AbstractBoton
{
public $_sTexto;
abstract function MostrarBoton();
}
class BotonLinux extends AbstractBoton
{
function __construct($texto)
{
$this->_sTexto = $texto;
echo 'Creado Boton Linux: '."<br>";
}
function MostrarBoton()
{
echo 'Mostrado Boton Linux: '.$this->_sTexto."<br>";
}
}
class BotonWindows extends AbstractBoton
{
function __construct($texto)
{
$this->_sTexto = $texto;
echo 'Creado Boton Windows'."<br>";
}
function MostrarBoton()
{
echo 'Mostrado Boton Windows: '.$this->_sTexto."<br>";
}
}
?>
Modo de uso
Para usar este ejemplo de Patrón de diseño Abstract Factory en PHP hacemos uso de una función helper (CrearAplicacion)
<?php
function CrearAplicacion($so, $tv)
{
$ventana = $so->CrearVentana($tv);
$ventana->MostrarVentana();
$btn1 = $so->CrearBoton('btn1');
$btn1->MostrarBoton();
$btn2 = $so->CrearBoton('btn2');
$btn2->MostrarBoton();
echo "<br>";
}
CrearAplicacion(AbstractInterfazFactory::RecogerFactory('Windows'), 'Microsoft Word');
CrearAplicacion(AbstractInterfazFactory::RecogerFactory('Linux'), 'Firefox');
?>
A partir del diagrama de clases hemos generado el código fuente anterior, el proceso es simple, solo intenta asociar el diagrama de clases con el código fuente y te darás cuenta.
El código fuente completo puede descargarse (ver debajo).