Tempo fa iniziavo il discorso Design Pattern e lo facevo con una implementazione del Singleton. Con questo articolo voglio riprendere il discorso sul Design Pattern parlando del Factory.
Il Factory fornisce un’interfaccia per creare famiglie di oggetti connessi o dipendenti tra loro, in modo che non ci sia necessità da parte dei client di specificare i nomi delle classi concrete all’interno del proprio codice.
In questo modo si permette che un sistema sia indipendente dall’implementazione degli oggetti concreti.
Un esempio tipico è quello della connessione ad un database. Un software, grazie all’ausilio di classi/driver potrebbe essere in grado di utilizzare un database qualsiasi. Grazie al Factory si può selezionare il driver selezionato - anche caricando i file fisicamente - e solo quello selezionato.
Volendo rappresentare sotto forma di codice tali concetti, in PHP potremmo creare qualcosa di simile a questo:
class Factory {
public static function database ( $type ) {
if (file_exists("{$_SERVER['DOCUMENT_ROOT']}/Drivers/Databases/{$type}.php")) {
include("{$_SERVER['DOCUMENT_ROOT']}/Drivers/Databases/{$type}.php");
$className = strtolower($type);
return new $className;
} else throw new Exception ('Driver not found');
}
}
La classe Factory implementa un interfaccia statica che serve a selezionare il driver che di volta in volta viene specificato come parametro al metodo Factory::database. Quest’ultimo, verificherà la presenza del file contente la classe/driver, la caricherà ed istanzierà l’oggetto in maniera automatica.
Dovesse non essere disponibile il driver, il metodo solleverà un eccezione.
Successivamente, per istanziare una connessione ad un database, ergo, creare un nuovo oggetto driver, non dobbiamo far altro che chiamare il metodo statico Factory::database e come parametro indicare il tipo di database a cui connettersi. Il risultato di tale operazione sarà l’oggetto/driver da noi richiesto.
# Carico le interfacce per MySQL
$db = Factory::database('MySQL');
# o carico le interfacce per SQLite
$db = Factory::database('SQLite');
# o carico le interfacce per MS SQL Server
$db = Factory::database('MSSql');
Ricapitolando, questo pattern è utile quando:
- Si vuole un sistema in grado di funzionare indipendentemente da come gli oggetti vengono creati;
- Si vuole fornire una libreria di classi mostrando solo le interfacce e non come esse sono implementate.














