Il pattern Factory Method

Costruire gli oggetti con il pattern Factory Method

Il pattern Factory Method è un pattern di tipo creazionale, ovvero si occupa della costruzione degli oggetti e delle problematiche che si possono originare. Questo tipo di pattern astraggono il processo di creazione degli oggetti, nascondono i dettagli della creazione e rendono i sistemi indipendenti da come gli oggetti sono creati e composti.

In particolare il pattern Factory incapsula la creazione concreta degli oggetti, consentendo al client (l’utilizzatore) di non conoscere i dettagli della creazione degli oggetti. In questo modo il client è liberato dalla necessità di conoscere l’oggetto istanziato, il pattern Factory Method restituisce una classe astratta, e si realizza attraverso più classi ereditate dalla classe astratta.

Il pattern Factory Method è così composto:

  1. Contesto:
    • Un tipo (creatore) crea oggetti di un altro tipo (prodotto);
    • Le sottoclassi del tipo creatore devono creare prodotti di tipi diversi;
    • I clienti non hanno bisogno di sapere il tipo esatto dei prodotti.
  2. Soluzione:
    • Definire un tipo per un creatore generico;
    • Definire un tipo per un prodotto generico;
    • Nel tipo creatore generico, definire un metodo (detto appunto metodo fabbrica) che restituisce un prodotto generico;
    • Ogni sottoclasse concreta del tipo creatore generico realizza il metodo fabbrica in modo che restituisca un prodotto concreto.

Il pattern Factory Method

L’interfaccia Creator rappresenta il creatore generico, mentre Product rappresenta il prodotto generico creato dal Factory Method. Esiste una relazione di dipendenza tra Creator e Product perché il creatore ha un metodo (factoryMethod) che restituisce un oggetto di tipo Product. Entrambe le interfacce saranno implementato da un creatore concreto e un prodotto concreto, in particolare ConcreteCreator specifica il factoryMethod per restituire l’istanza di ConcreteProduct opportuna.

Il Factory Method pattern consente alle sottoclassi di decidere quali classi istanziare, questo non vuol dire che la scelta viene fatta a run time dalle sottoclassi… vuol dire che la creazione concreta è fatta dall’opportuno ConcreteCreator utilizzato dalla classe client che la utilizza.

L’uso di questo pattern consente un codice è più flessibile e riusabile senza l’onere di dover istanziare ed utilizzare specifiche classi. Utilizzando l’interfaccia Product può lavorare con qualsiasi ConcreteProduct (anche future estensioni). L’uso estensivo del Factory Method comporta un aumento del numero di classi. Per ogni particolare Product si dovrebbe creare una super classe opportuna.

LinkedList, un esempio del pattern Factory Method in Java

Il pattern Factory Method viene applicato nella creazione di iteratori da parte delle collezioni come LinkedList.

Il pattern Factory Method

Iterable rappresenta il creatore generico e Iterator il prodotto generico. Un produttore generico è rappresentato dalla classe LinkedList, che implementa Iterable. La classe LinkedList costruisce internamente un iteratore concreto, di una classe che non è documentata nella libreria standard, e che nel diagramma viene chiamata ConcreteIterator, è possibile che in realtà sia una classe interna privata di LinkedList.

Il pattern Iterator è strettamente collegato al Factory pattern perché Iterator serve ad accedere agli elementi di una collezione sequenzialmente; ed in particolare modo, il suo metodo iterator() è classificabile come Factory Method. Il metodo assolve il suo chiamante dalla necessità di conoscere quale classe sia realmente istanziata.

Per la lista completa di tutti i design pattern fate riferimento a questa pagina.

Pubblicato in Design Pattern, Guide, Java, Programmazione Taggato con: , , , , , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*