PHP design pattern

Da Skypedia.

Visto che PHP ha introdotto l'OOP solo nella versione 5 molti programmatori finora hanno utilizzato solo metodi di programmazione procedurale. Con l'ausilio dei Design Patterns possiamo adesso risolvere molti problemi comuni utilizzando soluzioni comprovate.

Factory pattern

Il concetto che sta dietro questo pattern è quello di seguire l'Open-Closed principle. Quello che si vuole risolvere con questo pattern è un problema di creazione di oggetti che possa essere risolto invocando un metodo statico create($string) che possa creare (fabbricare) un oggetto a seconda dell'argomento ricevuto nell'invocazione del metodo. Il factory pattern costruisce una classe o un'interfaccia per la creazione di classi per la creazione dinamica degli oggetti non tramite new ma con un metodo create interno alla factory.

Se si volesse in un secondo momento cambiare il tipo di oggetto creato potremmo semplicemente cambiare il codice all'interno della factory o implementare un'interfaccia comune per molteplici classi che agiranno da factory ma che avranno metodi analoghi.

Esempio

 <?php
 interface IUtente
 {
   function getName();
 }
 
 class Utente implements IUtente
 {
  public function __construct( $id ) { }
 
  public function getName()
  {
    return "Jack";
  }
 }
 
 class FactoryUtente
 {
  public static function Create( $id )
  {
    return new Utente( $id );
  }
 }
 
 /* Creo l'utente non tramite un new Utente(ID) ma con una chiamata a factory */
 $utente = FactoryUtente::Create( 1 );
 echo( $utente->getName()."\n" );
 ?>

Singleton pattern

Questo pattern serve a creare delle istanze esclusive di una data risorsa. Viene utilizzato quando si vuole avere accesso esclusivo, tramite una singola istanza di una classe, ad una risorsa. L'unico modo per prendere l'istanza di una data classe dovrebbe essere quella di invocare il metodo statico getIstance(), mentre il costruttore sarà privato.

Esempio

 <?php
         class ClasseEsclusiva {
  		 private $_istance;
  		  /* il costruttore è privato */
  		  private function __construct() { }
 		  public static function getIstance() {
                           if($this->_istance == null) {
                              $this->_istance = new ClasseEsclusiva(); 
                           }
                           return $this->_istance;
                   }
            } 
            $a = ClasseEsclusiva::getIstance();
 ?>

Strategy pattern

Lo strategy pattern consente di implementare diverse strategie per la risoluzione di un problema partendo da un'interfaccia comune. In pratica si definisce un'interfaccia che abbia un dato metodo e si implemeta in classi differenti che avranno il compito di implementare il metodo corretto e particolare per la risoluzione. Una combinazione molto usata è quella con il factory che si occupa di instanziare l'oggetto corretto per il metodo che vogliamo implementare. Quindi utilizzando il factory avremo un'interfaccia alle classi che implementano la soluzione corretta che verrà scelta dinamicamente. Un esempio di S.P. potrebbe essere quello di un sorter per una lista di dati. Vediamolo in dettaglio.

Esempio

 <?php
     interface ISorter {
         function sort(array $vett);
     }
     class BubbleSorter implements ISorter{
         public function __construct() {}
         function sort(array $vett) {
             // implementazione del bubble sort
         }
      }
      class Quicksorter implements ISorter {
         public function __construct() {}
         function sort(array $vett) {
              // implementazione del quicksort
         }
       }
 ?>

--Skydiamond 18:30, 27 nov 2007 (CET)

Template pattern

  • Definisce la struttura di un algoritmo
  • Raccoglie il codice di uso comune in un punto unico
  • Impone un'architettura comune per le classi derivate

Builder pattern

  • Gestisce il comportamento di una classe dividendo i compiti della costruzione e della supervisione
  • La supervisione (director) assembla le parti dell'oggetto che si vuole creare chiamando metodi del builder che ha coscienza solo di come fare le cose
  • Analogia con architetto e muratore

Composite pattern

  • Gestisce la creazione di singoli oggetti e la creazione di collezioni di questi ultimi che hanno metodi analoghi
  • Utilizzato per dare la possibilità all'utilizzatore di manipolare gli oggetti in modo uniforme, organizza gli oggetti in una struttura ad albero

Risorse