
Il Simple Factory è un modello di progettazione creazionale che ha lo scopo di centralizzare la logica di creazione degli oggetti in un unico punto (di solito una classe o un metodo dedicato). A partire da una configurazione, una scelta dell’utente o altro, la factory restituisce un’istanza concreta corrispondente.
Si parla di Simple Factory quando la logica di creazione degli oggetti non solo viene centralizzata in un unico punto, ma include anche la scelta tra più classi concrete da istanziare in base a un parametro (stringa, enum, configurazione). In questo senso, viene spesso applicato in modo naturale e spontaneo, anche senza nominarlo esplicitamente.
Nella pratica, molti chiamano il Simple Factory semplicemente Factory Pattern, ma formalmente il Factory Method e l’Abstract Factory sono design pattern ufficiali del GoF, mentre il Simple Factory è un pattern informale, più semplice e diretto.
Struttura
Il Simple Factory è un pattern molto semplice. Si tratta di un metodo di una classe, un VI o un frammento di codice che crea oggetti su richiesta. Richiede un ingresso (tipicamente una stringa o enum) per decidere quale classe concreta istanziare. L’output è l’oggetto restituito dal Simple Factory.
Il Simple Factory disaccoppia il client dalle classi concrete. Il client lavora solo con interfacce o classi base, rendendo il sistema più flessibile, estensibile e manutenibile.
Esempio reale
Supponiamo di avere un’applicazione che deve esportare documenti in formati diversi: PDF, Excel, Word, ecc. Il client non deve conoscere i dettagli di ogni formato ma lavora solo con la classe base DocumentExporter (andrebbe bene anche un’interfaccia) per generare il documento. Le classi concrete poi CSVExporter, HtmlExporter e PdfExporter si occuperanno di generare effettivamente il documento scelto.
L’immagine seguente mostra la gerarchia delle classi coinvolte.

Il SimpleFactory prende in input il “tipo” richiesto e restituisce l’oggetto giusto. In LabVIEW, il Simple Factory è implementato tramite una Case Structure alimentata da una stringa o enum.

L’implementazione completa dell’esempio è disponibile qui: LabVIEW e C#.
Vantaggi e svantaggi
Similmente agli altri Factory visti, il Simple Factory ha i seguenti vantaggi:
- Centralizzazione della logica di creazione. Tutta la logica necessaria per decidere quale classe concreta instanziare viene posta in un unico punto (factory).
- Separazione tra client e classi concrete. Il client sa cosa vuole (un’interfaccia o una superclasse), ma non conosce i dettagli di come o quale classe concreta viene creata.
- Disaccoppiamento e manutenibilità. Se cambia il nome o l’implementazione di una classe concreta, si modifica solo la factory, non tutto il codice client.
Il principale svantaggio invece del Simple Factory è che aggiungere un nuovo tipo richiede di modificare la factory esistente. Ogni volta che si introduce una nuova classe concreta, bisogna tornare nella factory e aggiungere un nuovo caso. Questo viola il principio Open/Closed.
Conclusioni
Il Simple Factory è, per sua natura, un modello di progettazione creazionale pratico e immediato.
Non a caso, esso emerge spontaneamente non appena si avverte la necessità di centralizzare la logica di creazione degli oggetti basata su un descrittore di tipo. Se il sistema richiede che una classe concreta (ad esempio, PdfExporter) venga istanziata in base a un valore di ingresso (ad esempio, la stringa “PDF”), la soluzione implementativa più diretta e logica è una struttura decisionale centralizzata (Case Structure o switch/case). Questa logica, che mappa l’input all’output corretto, è il Simple Factory.
In questo senso, il Simple Factory è il fondamento, l’approccio di default che si adotta ogni volta che si ha un parametro in ingresso che funge da selettore per la classe da creare.
Le alternative Factory Method e l’Abstract Factory non eliminano questa logica di selezione; la trasformano e la distribuiscono in una gerarchia di classi. Lo fanno solo per ottenere una maggiore estensibilità per applicazioni che necessitano di aggiungere nuovi tipi di oggetti molto frequentemente.
È interessante notare come il Simple Factory non venga eliminato dai pattern più complessi, ma spesso riutilizzato ad un livello superiore. Nella pratica, i sistemi che implementano il Factory Method e l’Abstract Factory tipicamente usano un Simple Factory per istanziare l’oggetto iniziale, cioè la Factory Concreta o il Creator Concreto appropriato, in base a una configurazione di sistema o a un input iniziale. In questo scenario, il Simple Factory agisce come un punto di lancio (launcher), decidendo quale factory istanziare, delegando poi la creazione degli oggetti specifici all’altro pattern più sofisticato.
Per tutti gli altri scenari, dove l’insieme dei prodotti da creare è stabile e noto, il Simple Factory è più che sufficiente e rimane la scelta più semplice e diretta per centralizzare il processo di creazione. Comprendere la semplicità e i limiti del Simple Factory è la chiave per capire perché e quando migrare verso un pattern creazionale più sofisticato.