Está en la página 1de 5

Clasificacin del patrn

Creacional.

Intencin o problema que soluciona


Centraliza en una clase constructora la creacin de objetos de un subtipo de un tipo determinado, ocultando al cliente la casustica para elegir el subtipo que crear.

Motivacin
Muchos de ustedes pensaran: Por qu complicarme tanto la vida utilizando un patrn de diseo, en lugar de instanciarla directamente $obj = new MiClase () ? Hay un escenario principal en el que puede resultar til. Flexibilidad en tiempo de ejecucin: A veces es imposible elegir de antemano cul objeto especfico debe ser instanciado, ya que la eleccin de los objetos a utilizar puede depender de algo en el entorno de ejecucin.

Aplicabilidad
1. Una clase no puede prever la clase de objetos que debe crear. 2. Centralizar la creacin de objetos. 3. Proveer una interfaz para el cliente, permitiendo crear una familia de objetos sin especificar su clase.

Estructura

Implementacin
La clase UserFactory tiene un mtodo esttico create, el cual recibe como parmetro un argumento y segn el valor de este decide que clase instanciar (usualmente una subclase).

Usuario invitado ___> GuestUser

Cdigo de Ejemplo en PHP5


Existen diferentes tipos y variantes de fbricas. En este artculo explicar el Simple Factory.
view plaincopy to clipboardprint?

1. interface FactoryInterface { 2. static public function Create($name); 3. }

interface UserInterface {<br /> s

view plaincopy to clipboardprint?

1. abstract class User { 2. 3. protected $name = NULL; 4. 5. public function __construct($name) 6. { 7. $this->name = $name; 8. } 9. 10. public function getName() 11. { 12. return $this->name; 13. } 14. 15. public function hasReadPermission() 16. { 17. return true; 18. } 19. 20. public function hasModifyPermission() 21. { 22. return false; 23. } 24. 25. public function hasDeletePermission() 26. { 27. return false; 28. } 29. 30. public function wantsFlashInterface() 31. { 32. return true; 33. } 34. }
abstract class User {<br /> <br

view plaincopy to clipboardprint?

1. class GuestUser extends User { }


class GuestUser extends User

view plaincopy to clipboardprint?

1. class CustomerUser extends User { 2. function hasModifyPermission() 3. { 4. return true; 5. } 6. }


class CustomerUser extends Us

view plaincopy to clipboardprint?

1. class AdminUser extends User { 2. 3. public function hasModifyPermission() 4. { 5. return true; 6. } 7. 8. public function hasDeletePermission() 9. { 10. return true; 11. } 12. 13. public function wantsFlashInterface() 14. { 15. return false; 16. } 17. }
class AdminUser extends User

view plaincopy to clipboardprint?

1. class UserFactory implements FactoryInterface { 2. 3. private static $users = array('Arley'=>'admin', 'Michel'=>'guest', 4. 'Derick'=>'customer'); 5. 6. /** 7. * Funcin de creacin de usuarios. Recibe el tipo 8. * de usario a crear y retorna una instancia valida 9. * 10. * @access public static 11. * @param string $name 12. * @return object 13. */ 14. static public function Create($name) 15. { 16. if (!isset(self::$users[$name])) { 17. throw new Exception('El nombre de usuario '.$name.' es desconocido' ); 18. } 19. switch (self::$users[$name]) { 20. case 'guest': return new GuestUser($name);

21. 22. 23. 24. 25. 26. 27. }

case 'customer': return new CustomerUser($name); case 'admin': return new AdminUser($name); default: throw new Exception('Tipo de usario desconocido'); } }

class UserFactory {<br /> <br />

view plaincopy to clipboardprint?

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.

function boolToStr($b) { if ($b == true) { return "Si\n"; } else { return "No\n"; } } function displayPermissions(User $obj) { print $obj->getName() . ' permiso:</br>'; print 'Lectura: ' . boolToStr($obj->hasReadPermission()).'</br>'; print 'Modificar: ' . boolToStr($obj->hasModifyPermission()).'</br>'; print 'Escritra: ' . boolToStr($obj->hasDeletePermission()).'</br>'; } function displayRequirements(User $obj) { if ($obj->wantsFlashInterface()) { print $obj->getName() . ' requiere Flash </br></br>'; } } $logins = array('Arley', 'Michel', 'Derick'); foreach($logins as $login) { displayPermissions(UserFactory::Create($login)); print '</br>'; displayRequirements(UserFactory::Create($login)); }

También podría gustarte